「这是我参与 11 月更文挑战的第 14 天,活动详情查看:2021最后一次更文挑战」。
你好,我是悟空呀。今天给大家带来的大厂面试题是:
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