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