volatile 底层实现
一. volatile 的作用
1、线程可见线
2、禁止指令重排序
什么是线程可见性 ?
举个例子、富二代小王有一套1亿的别墅,他想要租出去,于是就找了10个人想租套别墅,他和这10个人都谈了一次,第二天有一个人买走了,于是富二代就通知其他9个人这套别墅已经租出去了。
-
其中别墅就是众多线程要访问的值,
-
10个人就是众多线程
-
通知其他9个人这套别墅已经租出去了就是线程可见性,
‘
底层通过mesi缓存一致性协议’独占(exclusive)、共享(share)、修改(modified)、失效(invalid)
线程1与线程2都会将X读入到自己的工作内存中,此时线程2将X的值改为10000但是线程用的还是X=1的值,此时cpu总线嗅探机制会发现线程2已经将X修改了,,这时MESI缓存一致性协议会r让线程1中X的值让他失效,而且线程1会重新读一遍主内存中的值.因为从嗅探发现X被修改到把新值写会主内存是一个原子操作,所以不会在写回主内存的过程中被其他新线程读继续取到原来的值