https://www.cnblogs.com/dolphin0520/p/3920373.html
volatile有两层语义:
1.保证多线程对变量操作时的可见性,即一个线程对变量修改后,对其他线程立刻可见。
2.禁止指令重排序。
第一点,在计算机内存模型上存在数据缓存一致性的问题。因为在执行程序时所有的指令都是在CPU上面进行执行的,指令执行过程中又会涉及到数据的读和写,由于数据存储在内存中,而CPU执行又非常快,从内存读取数据和向内存写入数据对于CPU执行来说是非常慢的会降低效率,因此CPU里面就多了一个高速缓存,将内存的数据提前读取到高速缓存中,然后CPU通过高速缓存进行数据的读写计算。执行完后再将数据刷新到内存中。
比如,两个线程同时执行一个语句 i=i+1
初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。
最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。
也就说,一个变量在多个缓存中,就可能造成缓存一致性问题。
为了解决缓存一致性问题。,通常来说有以下2种解决方法:
1)通过在总线加LOCK#锁的方式
2)通过缓存一致性协议