为了更好的说明volatile可见性的使用场景看下面的案例:
* cpu现在是多核的,那么各自之间会存在缓存不一致的问题 * 以前的解决办法是:总线加锁,在第一个线程来的时候开始加锁当这个线程执行完成后,进行 * 解锁后第二个线程才可以进行读取值进行操作。这样的话效率低下。 * 现在的解决办法是:MESI缓存一致性协议一个线程在修改值后,需要同步到主存这个时候 * 其他的CPU通过嗅探机制达到数据失效,然后从主存读取数据 * 加入volatile关键字后,底层是加入了lock的前缀指令这个指令就是触发缓存一致性协议,对回写到 * 主存的数据进行加锁
线程Thread-1将数据进行了更改
可以发现另外一个線程始终进行着死循环,无法退出那么说明这个flag参数在另外一个线程中不可见,那么volatile上线了可以在flag之前加一个volatile进行修饰,结果如下:
* cpu現在是多核的那么各自之间会存在缓存不一致的问题。 * 以前的解决办法是:总线加锁在第一个线程来的时候开始加锁,当这个线程执荇完成后进行 * 解锁后,第二个线程才可以进行读取值进行操作这样的话,效率低下 * 现在的解决办法是:MESI缓存一致性协议,一个线程茬修改值后需要同步到主存。这个时候 * 其他的CPU通过嗅探机制达到数据失效然后从主存读取数据。 * 加入volatile关键字后底层是加入了lock的前缀指令,这个指令就是触发缓存一致性协议对回写到 * 主存的数据进行加锁。
线程Thread-1将数据进行了更改
线程Thread-0将数据进行了更改