在 volatile 变量写入后写入的变量的可见性

Joh*_*ith 5 java parallel-processing multithreading volatile

public class Test {
    private static volatile boolean flag = false;
    private static int i = 1;
    public static void main(String[] args) {
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = true;
            i += 1;
        }).start();
        new Thread(() -> {
            while (!flag) {
                if (i != 1) {
                    System.out.println(i);
                }
            }
            System.out.println(flag);
            System.out.println(i);
        }).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

变量i写在 volatile 变量标志之后,但代码输出 true 2。看起来i第一个线程的修改对第二个线程是可见的。

按照我的理解,变量I应该写在flag之前,这样第二个线程就可以知道变化了。

Fra*_*ani 1

内存模型定义了保证,但是任何事情都可能发生在它们之上。

在 x86 上,所有写入都具有释放语义,并且一旦写入变量,其更新值将尽快从其他线程中可见。

因此,写入易失性变量之前的操作发生在读取该变量之后的操作之前,这一事实并不能阻止写入该变量之后的操作在读取该变量后变得可见。