写点什么

对比 volatile vs synchornized

作者:悟空聊架构
  • 2021 年 12 月 05 日
  • 本文字数:619 字

    阅读完需:约 2 分钟

你好,我是悟空呀。今天我们学习下 volatile 和 synchornized。

volatile vs synchornized?

面试者小空听到这题后,窃喜,这题简单,不假思索地回答:volatile 保证可见性。


面试官面无表情的说道:还有吗?


小空支支吾吾的没有答上来。


面试官继续说:

volatile 有什么特点?

  • volatile 保证了可见性:当一个线程修改了共享变量的值时,其他线程能够立即得知这个修改。

  • volatile 保证了单线程下指令不重排:通过插入内存屏障保证指令执行顺序。

  • volatile 不保证原子性,如 a++ 这种自增操作是有并发风险的,比如扣减库存、发放优惠券的场景。

  • volatile 类型的 64 位的 long 型和 double 型变量,对该变量的读/写具有原子性。

  • volatile 可以用在双重检锁的单例模式中,比 synchronized 性能更好。

  • volatile 可以用在检查某个状态标记以判断是否退出循环。

volatile 和 synchornized 对比

  • volatile 只能修饰实例变量和类变量,synchronized 可以修饰方法和代码块。

  • volatile 不保证原子性,而 synchronized 保证原子性

  • volatile 不会造成阻塞,而 synchronized 可能会造成阻塞

  • volatile 轻量级锁,synchronized 重量级锁

  • volatile 和 synchronized 都保证了可见性和有序性。


小空听完后,叹了一口气,今天又是被面试官吊打的一天。


作者简介:悟空,8 年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM 性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构。本文已收录至 www.passjava.cn

用户头像

用故事、大白话讲解Java、分布式、架构设计 2018.05.06 加入

公众号:「悟空聊架构」 【个人博客】www.passjava.cn 【开源项目】基于 SpringCloud 的一套面试刷题系统 【Github】https://github.com/Jackson0714/PassJava-Platform

评论

发布
暂无评论
对比 volatile vs synchornized