小编Joh*_*ith的帖子

在 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之前,这样第二个线程就可以知道变化了。

java parallel-processing multithreading volatile

5
推荐指数
1
解决办法
169
查看次数