volatile保证可见性

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

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/108359794