volatile的相关问题

来源:5-3 面试官出难题:volatile关键字实现原理

慕粉4331336

2021-04-07

当一个变量被volatile修饰,我们所说的不发生指令重排的具体含义如下

  1. (happens-before语意)volatile作为一个屏障在发生volatile的读写的时候,周围的几条指令不会被重排,这个周围怎么理解,什么时候又可以重排了呢。
  2. (可见性语意)使用volatile保证了每次读写的时候都可以拿到最新的版本,这个最新版本看老师课堂上讲的是L3缓存或者是内存,而一个变量的修改从L1缓存传播到L3缓存是需要时间的,那么另外一个稍晚但是准备读取最新变量值是怎么感知到变量的修改,而需要等待获取最新值。让我感觉到困惑的依然是其实多核CPU其实也是一个多副本的数据库,每个寄存器依然相当数据库,在这种并发场景下,怎么保证读取和写入像是“线性”的呢。
写回答

1回答

求老仙

2021-04-11

关于指令重排的范围,一方面是编译器的优化,这部分包括我讲的partial 初始化的类。增加了volatile后,volatile变量的赋值,会等到类初始化完全之后。所以这方面是java在优化。

另一个方面是volatile读取,写入和下一条指令的关系,不会倒置。(范围就这么大)

最后是增加一些屏障指令。(见我volatile的补充文档:)

0
1
慕粉4331336
非常感谢!
2021-04-14
共1条回复

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程