java volatile解析

解析volatile之前需要先叙述一下cpu的内存机制。
cpu 的操作数和操作指令是保存的内存中,在cpu计算的时候,先将数据复制一份在各自的高速缓存中。
当设计到多核的cpu的时候,因为各自线程在各自cpu操作,那么同一个内存的变量就在不同的cpu里面有各自的一份缓存了。从而导致数据操作就有了缓存不一致的问题。
常见的缓存一致性问题解决方案:
1)通过在总线加LOCK#锁的方式
2)通过缓存一致性协议:缓存一致性协议,其实简单来说就是一个替补协议。当CPU对一个共享变量操作写操作的时候,它会通知其他cpu的缓存是失效的,其他cpu这时候只能从主存读取最新的变量值。注意这里只有在写操作的时候才会通知,失效的,也就是如果cpu在缓存中变量进行数据操作的时候,其实并不会通知其他CPU。在CPU操作缓存,到将变量写到主存这个间断来说,其他cpu还是拿到各自的缓存。
下面让我们从上面的原理来介绍volatile的原理:
可见性:所谓的可见性,就是这个共享变量发生改变了,导致其他线程cpu的缓存失效,只能去主存读取。
原子性:volatile没有原子性,假如两个形成都在cpu内对共享变量操作,我们极端想象,写入主存的时候,另外一个线程已经操作完了,从而第二线程也将数据写入。揪着根本原因cpu在对共享缓存操作的时候,并没有通知其他cpu的缓存失效。

猜你喜欢

转载自blog.csdn.net/yinghonghui/article/details/82913576
今日推荐