![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=1738941383-Z4ms93c5rwnC9ordtImVeJOyQptB2IBr-0-733b98e36585a99e891c1bd2b761042b)
然后,使用hsdis工具获取JIT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。
接着,设置JVM运行时参数:
![](https://epubservercos.yuewen.com/11B439/23020636309729206/epubprivate/OEBPS/Images/42136-00-130-2.jpg?sign=1738941383-VrolxbTluDpc4rgIkMs9ibk7lBw2cA9M-0-38f90bcd440bedba2e8e95dbee1ec0d4)
得到的结果如下:
![](https://epubservercos.yuewen.com/11B439/23020636309729206/epubprivate/OEBPS/Images/42136-00-130-3.jpg?sign=1738941383-f3OrhPyzLPbulHDTVoS9ad13cHx0W0qg-0-8e2872ae58788d18a6ccdfd5f5261884)
从上述结果中我们发现,在main线程中修改stop变量的值时,在修改命令前面会增加一个Lock#信号,这使得基于缓存锁/总线锁的方式达到一致性,从而保证结果的可见。
关于hsdis工具的使用方法,笔者上传到本书配套的代码concurrent-chapter-3模块下的resouce目录中,感兴趣的读者可以自己学习。
导致可见性问题的根本原因的分析到这里并没有结束,因为除高速缓存带来的可见性问题外,指令重排序也会导致可见性问题。