由于CPU高速缓存的出现使得如果多个cpu同时缓存了相同的共享数据时,可能存在可见性问题。也就是CPU0修改了自己本地缓存的值对于CPU1不可见。不可见导致的后果是CPU1后续在对该数据进行写入操作时,是使用的脏数据。使得数据最终的结果不可预测。
很多同学肯定希望想在代码里面去模拟一下可见性的问题,实际上,这种情况很难模拟。因为我们无法让某个线程指定某个特定CPU,这是系统底层的算法,JVM应该也是没法控制的。还有最重要的一点,就是你无法预测CPU缓存什么时候会把值传给主存,可能这个时间间隔非常短,短到你无法观察到。最后就是线程的执行的顺序问题,因为多线程你无法控制哪个线程的某句代码会在另一个线程的某句代码后面马上执行。
所以我们只能基于它的原理去了解这样一个存在的客观事实了解到这里,大家应该会有一个疑问,刚刚不是说基于缓存一致性协议或者总线锁能够达到缓存一致性的要求吗?为什么还需要加volatile关键字?或者说为什么还会存在可见性问题呢?
如果觉得《初步认识Volatile-总结可见性的本质》对你有帮助,请点赞、收藏,并留下你的观点哦!