对比 volatile vs synchornized
你好,我是悟空呀。今天我们学习下 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
评论