volatile理解

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)通过缓存一致性协议

这两种方式都是从硬件层面上解决缓存一致性问题。

 

posted on 2022-02-22 00:10  云中哥  阅读(30)  评论(0编辑  收藏  举报

导航