变量在两个正在运行的线程之间应该是易失性的吗?

duh*_*kal 3 java multithreading volatile

在这种情况下应该int a是易失性的以保证线程之间的可见性吗?

private volatile static int a = 0;

public static void main(String[] args) {
    
    Thread t1 = new Thread(new Runnable() {
        
        @Override
        public void run() {
            a = 10;
        }
    });

    
    Thread t2 = new Thread(new Runnable() {
        
        @Override
        public void run() {
            System.out.println(a);
        }
    });
    
    t1.start();
    t2.start();
    
}
Run Code Online (Sandbox Code Playgroud)

输出

10
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

语言规范中明确定义了happens-before,请先阅读它;首先。

然后,要完全理解发生了什么,您需要知道程序顺序是什么,以及同步顺序

简而言之,请看下面的内容:

private volatile static int a = 0;
private static int b = 0;

public static void main(String[] args) {

    Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            b = 100;
            a = 10;
        }
    });


    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            if(a == 10){
                System.out.println(b);
            }

        }
    });

    t1.start();
    t2.start();

}
Run Code Online (Sandbox Code Playgroud)

您拥有的唯一保证是,当且仅当t2打印某些内容时,它将始终是100。这是因为看到t2了一个来。发生这种情况是因为从写入线程到读取线程,已经建立了“发生之前”,并且保证之前完成的每个操作对于已经看到该操作的线程是可见的。volatile writeaa = 10a10