volatile
(不稳定的)
修饰共享变量(类的成员变量,类的静态成员变量)
volatile保证线程间的可见性
修饰共享变量,防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见
static Boolean flag
new Thread(修改flag;
)
new Thread(while(flag){}
)
普通情况下,在JVM虚拟机中存在JIT(即时编译器)对代码做了优化,如果这个变量是在另一个线程中修改,那JIT会将动态的条件转成静态的条件
while(Flag){
}
改成
while(true){
}
解决方案
1,在VM参数中禁用JIT(不推荐)
2,在共享变量上添加volatile,告诉JIT不要做优化
volatile禁止指令重排序
修饰共享变量会在读写共享变量时加入不同屏障,阻止其他读写操作越过屏障,从而达到阻止重排序效果
@使用@JCStressTest注解引入框架进行线程测试
使用注解@Actor保证代码在同一个线程中执行
重排序
出现程序不按编译时的前后顺序执行得到结果的情况
操作屏障
被volatile修饰符修饰的变量会在对应位置生成屏障
写操作屏障
阻止上方其他的写操作越过屏障排到volatile屏障之下
下面的指令可以向上重排序
读操作屏障
阻止下方其他的读操作越过屏障排到volatile屏障之上
上面的指令可以向下重排序