![Java并发编程深度解析与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/971/43737971/b_43737971.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.3 volatile如何解决可见性问题
下面我们来看一下volatile是如何解决可见性问题的呢?如果我们针对stop字段增加volatile关键字:
![](https://epubservercos.yuewen.com/11B439/23020636309729206/epubprivate/OEBPS/Images/42136-00-130-1.jpg?sign=1739133731-D9AdGQGPIiyaap0sbuDG7c3My2Z0oen7-0-9951986b04da4bcc1077d58bdd59bcbb)
然后,使用hsdis工具获取JIT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。
接着,设置JVM运行时参数:
![](https://epubservercos.yuewen.com/11B439/23020636309729206/epubprivate/OEBPS/Images/42136-00-130-2.jpg?sign=1739133731-pcATYujsoMerXm1mP2YPcUajFabCZR26-0-d6d8f401e6961dbf0ef7976417ecf5e2)
得到的结果如下:
![](https://epubservercos.yuewen.com/11B439/23020636309729206/epubprivate/OEBPS/Images/42136-00-130-3.jpg?sign=1739133731-BPlf20xVRDNGfSxlsEywV0Usfz9YHDZI-0-d90aac7d1ed01c59b5a9ac17440efe45)
从上述结果中我们发现,在main线程中修改stop变量的值时,在修改命令前面会增加一个Lock#信号,这使得基于缓存锁/总线锁的方式达到一致性,从而保证结果的可见。
关于hsdis工具的使用方法,笔者上传到本书配套的代码concurrent-chapter-3模块下的resouce目录中,感兴趣的读者可以自己学习。
导致可见性问题的根本原因的分析到这里并没有结束,因为除高速缓存带来的可见性问题外,指令重排序也会导致可见性问题。