分不清的 volatile vs synchornized

260 阅读2分钟

「这是我参与 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