volatile
2021-03-30 10:28:58 0 举报
java多线程 volatile
作者其他创作
大纲/内容
指令执行顺序
1、a = 12、a=2
2
1、当对volatile变量执行写操作后,JMM会把工作内存中的最新变量值强制刷新到主内存2、写操作会导致其他线程中的缓存无效
3
Thread
禁止上面的volatile读和下面的volatile读重排序对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
第二个volatile写
把a失效,每次线程用到a都从主存中取
Load/Store
StoreStore屏障
第二个volatile读
写到主存中
1、a=1 2、把a失效
防止上面的volatile写和后面可能有的volatile读/写重排序对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。
第一个volatile读
禁止上面的volatile读和下面的普通写重排序对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
确保2执行前完成1
把a更改成2
禁止上面的普通写和下面的volatile重排序对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
1
普通写
LoadStore屏障
StoreLoad屏障
volatile是通过编译器在生成字节码时,在指令序列中添加“内存屏障”来禁止指令重排序的。
1、a = 1 2、a=2
第一个volatile写
LoadLoad屏障
禁止上面的volatile写和上面的volatile写重排序
volatile可以保证可见性和有序性
0 条评论
下一页