Java-concurrency icon indicating copy to clipboard operation
Java-concurrency copied to clipboard

关于《彻底理解volatile》中示例代码的问题

Open MikasaLee opened this issue 6 years ago • 4 comments

老哥,这副图中的线程a和线程b共同访问的变量a(没有volatile关键字)也能保证同步么?

MikasaLee avatar May 14 '18 05:05 MikasaLee

可以保证。可以从两个方面理解: 内存屏障: volatile关键字会在volatile写之前插入StoreStore,保证volatile写之前的内容先写入主内存,保证对所有线程可见(禁止a写和flag写的重排序);而volatile读后会插入LoadLoad和LoadStore,保证在读取变量a前,先读取flag(禁止a读和flag读重排序)。所以就能保证它们的可见性。

happens-before: 作者的代码没看,你可以看我的理解一下 /捂脸 image

最后根据传递性规则,① happens-before ④

CoDeleven avatar May 15 '18 02:05 CoDeleven

懂了,谢谢老哥指点

MikasaLee avatar May 15 '18 09:05 MikasaLee

老哥还想在问一下细节 JMM的内存屏障只是用来确保对volatile对象的读写操作不会发生重排序。 但是真正volatile关键字真正用来同步线程内存和主内存的操作是原文说的"Lock前缀的指令"这个作用吧,这个理解对么? (顺便问一下为啥我javap 看指令操作时没有发现一个Lock开头的指令。。)

MikasaLee avatar May 15 '18 10:05 MikasaLee

lock开头的指令是在JIT的汇编代码里 参考周志明的《深入Java虚拟机》P111

CoDeleven avatar May 19 '18 07:05 CoDeleven