一个简单的知识,让面试官知道你对这个知识有深入的了解!
问题分析
- 这个问题属于基础问题,今天回答全面并引导思路。
- 回答之前可以引入内容:Volatile介绍一下、Synchronized介绍一下。
- 根据回答进行扩展内容,引导面试官的思路!比如Volatile能不能保证线程安全?DCL(Double Check Lock)单例为什么要加Volatile?
回答的第一步(基本内容):Volatile和Synchronized有什么区别?这里要精简概括。
- (必须回答的内容)Synchronized关键字,用来加锁。
- (必须回答的内容)Volatile只是保持变量的线程可见性。
- 一般在一个线程写,多个线程读的场景中使用。
回答的第二步(扩展内容):从底层来说这俩个关键字
- Volatile在JVM层面使用内存屏障来保证可见性,调用汇编层面的lock前缀指令。其实简单说就是写完之后将数据刷道主内存(这里就可以引入JMM内存模型),读的时候从主内存重新加载(这里就可以引入硬件中的MESI一致性协议)。
- Synchronized是基于MESA管程模型在JVM中的实现(这里就可以引入锁升级,管程思想,管程在java中的实现方式CAS)。
回答的第三步(扩展内容):Volatile能不能保证线程安全?
- 不能保证线程安全。因为Volatile关键字只能保证线程可见性, 不能保证原子性。
- volatile++这种复合操作不具有原子性。
回答的第四步(扩展内容):DCL(Double Check Lock)单例为什么要加Volatile?
- Volatile防止指令重排。(这里可以扩展创建对象的三步第二三步可以互换位置:开辟空间、初始化对象信息、返回对象的地址给引用)
- 在DCL中,防止高并发情况下,指令重排造成的线程安全问题
结束语
- 获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师!
- 关注公众号,可以让你对MySQL、并发编程、spring源码有深入的了解!
- 关注公众号,后续持续高效的学习JVM!
- 这个公众号,无广告!!!每日更新!!!

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构