一个简单的知识,让面试官知道你对这个知识有深入的了解!
问题分析
- 这个问题属于基础问题,今天回答全面并引导思路。
- 回答之前可以引入内容: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!
- 这个公众号,无广告!!!每日更新!!!
![作者公众号.jpg](https://img-blog.csdnimg.cn/img_convert/9201097472cf4110cb25406db3bdd582.png)