学完本章中,读者需要回答:
1.什么是volatile?
2.volatile如何使用?
3. volatile的几个特性,如何解决volatile不保证原子性?
6.3.1 JMM Volatile 缓存一致性协议
当程序在运行过程中,计算机会将运算需要的数据(变量)从主内存复制一份到CPU高速缓存中,那么CPU进行运算的时候就可以从它的高速缓存读取和写入数据,当运算结束后,再将已经修改后的数据(变量)刷新重新写回到主存当中。这种情况在单线程中运行时没有任何问题的,但是在多线程中运行就会有问题了。
以多核CPU为例,现在有二个线程,一个线程A,一个线程B,主内存中有一个值为1的变量C。这二个线程都要进行赋值加一的操作。线程A从主内存中复制主内存中的变量C,线程B同样的从主内存中复制一份变量C,这个时候二个线程都有一份值为1的变量,同时进行加一的操作。把线程A的最新值2写入到主内存中。此时线程B的高速缓存当中变量C的值还是1,进行加1操作后,变量C的值为2,然后线程B把变量C的值写入主内存。这个时候问题就出现了,二个线程都把相同的值写入到主内存中,导致二次加一的操作变成了一次。
所以就出现了缓存一致性协议,这个协议保证了每个缓存(每个线程的私有的工作空间