volatile的可见性作用,我们必须意思到被volatile修饰的变量对所有线程总是可见的,对volatile变量的所有写操作总是能立刻反应到其他线程的。
public class VolatileVisibilitySample {
volatile boolean initFlag = false;
public void save(){
this.initFlag = true;
String threadName = Thread.currentThread().getName();
System.out.println("线程:"+threadName +":修改共享变量的initFlag");
}
public void load(){
String threadName = Thread.currentThread().getName();
while(!initFlag){
//在此处循环,等待initFlag状态改变
}
System.out.println("线程:"+ threadName +"当前线程嗅到了initFlag的状态的改变");
}
public static void main( String[] args ) {
VolatileVisibilitySample sample = new VolatileVisibilitySample();
Thread threadA = new Thread(()->{
sample.save();
},"threadA");
Thread threadB = new Thread(()->{
sample.load();
},"threadB");
threadB.start();
try {
Thread.sleep(1000);
}catch (Exception e){
}
threadA.start();
}
}
1、initFlag加上volatile关键字
线程A改变initFlag属性之后,线程B马上感知到
2、initFlag不加volatile关键字
线程B感知不到
史上最全的并发编程脑图:https://www.processon.com/view/5b1f1ad7e4b03f9d251c06e5#map