volatile可见性
2020-04-25 23:30:40 18 举报
volatile可见性详解
作者其他创作
大纲/内容
总线(MESI缓存一致性协议)
read
load
initflag=false
线程2
write
store(存储)
工作内存
initFlag=false
initFlag=true
lock
主内存
assign(赋值)
public class VolatileVisibilityTest { private static volatile boolean initFlag = false; public static void main(String[] args) throws InterruptedException{ new Thread(new Runnable(){ @Override public void run(){ System.out.println(\"waiting data...\"); while(!initFlag){ } System.out.println(\"========success!\"); } }).start(); Thread.sleep(2000); new Thread(new Runnable() { @Override public void run() { prepareData(); } }).start(); } public static void prepareData(){ System.out.println(\"start data...\"); initFlag = true; System.out.println(\"data end...\"); }}
当cpu总线嗅探机制(监听)察觉到总线发生变化时,工作内存中nitFlag=false失效且cpu重新read和load主内存为了防止cpu总线嗅探机制(监听)将还未write的数据重新写入工作内存中,会在store(存储)之前加锁(lock)且在write之后解锁(unlock),这样线程1就不会因为重新读取的是旧的数据而陷入死循环
use
initflag=false-->true
线程1(执行引擎)initFlag
initFlag=false-->true
unlock
volatile可见性
CPU
cpu总线嗅探机制(监听)
收藏
收藏
0 条评论
下一页