请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

volatile的相关问题

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

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

正在回答

1回答

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉4331336 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-04-14 17:42:06
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号