【面试:并发编程】Volatile和Synchronized有什么区别?

问题分析

  • 这个问题属于基础问题,今天回答全面并引导思路。
  • 回答之前可以引入内容: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
posted @ 2022-02-20 23:42  程序java圈  阅读(32)  评论(0编辑  收藏  举报