sleep()将在测试volatile时防止Java内存不一致

sleep()将在测试volatile时防止Java内存不一致,java,multithreading,volatile,Java,Multithreading,Volatile,我正在测试volatile关键字的内存一致性函数 这是不使用volatile的代码,程序将按预期卡住 package cn.demojie.singleton; public class VolatileTest2 { private static boolean flag = false; public static void main(String[] args) throws Exception { new Thread( () -> {

我正在测试
volatile
关键字的
内存一致性
函数

这是不使用volatile的代码,程序将按预期卡住

package cn.demojie.singleton;

public class VolatileTest2 {
  private static boolean flag = false;

  public static void main(String[] args) throws Exception {
    new Thread(
            () -> {
              while (!flag) {
                /* Uncomment it, the program won't get stuck anymore
                try {
                  Thread.sleep(0);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
                */
              }
            })
        .start();

    Thread.sleep(50);
    flag = true;
  }
}

但是当我像上面的注释一样添加
Thread.sleep()
时,程序就不会再卡住了

看来记忆的一致性是有效的。为什么?

System.out.println()
还可用作
线程.sleep()