
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.3 volatile如何解决可见性问题
下面我们来看一下volatile是如何解决可见性问题的呢?如果我们针对stop字段增加volatile关键字:

然后,使用hsdis工具获取JIT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。
接着,设置JVM运行时参数:

得到的结果如下:

从上述结果中我们发现,在main线程中修改stop变量的值时,在修改命令前面会增加一个Lock#信号,这使得基于缓存锁/总线锁的方式达到一致性,从而保证结果的可见。
关于hsdis工具的使用方法,笔者上传到本书配套的代码concurrent-chapter-3模块下的resouce目录中,感兴趣的读者可以自己学习。
导致可见性问题的根本原因的分析到这里并没有结束,因为除高速缓存带来的可见性问题外,指令重排序也会导致可见性问题。