volatile
- jMM(java内存模型)三大特性
原子性
有序性
可见性
- volatile关键字可以保证后两者。
- 可见性代码证明:
package com.company.myVolatile;
import java.util.concurrent.TimeUnit;
保证可见性
不保证原子性
保证有序性(禁止指令重排)
//线程Thread-0修改flag的值是否对main线程及时可见
public class TestVolatile {
private volatile boolean flag = false;
private void setFlag(boolean flag) {
this.flag = flag;
}
public static void main(String[] args){
TestVolatile testVolatile = new TestVolatile();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+":启动");
try {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
testVolatile.setFlag(true);
System.out.println(Thread.currentThread().getName()+"更新flag值为:"+testVolatile.flag);
}).start();
while(!testVolatile.flag){
//System.out.println(Thread.currentThread().getName()+":一直死循环中");
}
System.out.println(Thread.currentThread().getName()+":感受到flag值改变"+testVolatile.flag);
}
}
运行结果:
Thread-0:启动
Thread-0更新flag值为:true
main:感受到flag值改变true
有序性: