关于java并发可见性的问题

在看书过程中,看到一个可见性的例子,结果自己运行了一下,没有可见性的问题,这是为什么,也没加同步锁啊

 public class TestThread
{
    private   boolean ready;
    private  int number;
    @Test
    public void testVisibility() throws Exception
    {
        new Thread(()->{
            System.out.println(ready+"\t"+number);
           while(!ready)
           {
               try
               {
                   Thread.sleep(1);
               } catch (InterruptedException e)
               {
                   e.printStackTrace();
               }
           }
            System.out.println(number);

        }).start();

        Thread.sleep(1000);
        number=42;
        ready=true;
       while (Thread.activeCount()>2)
       {
           Thread.yield();
       }


    }
}

结果:
false 0
42
按照书上来说,他应该一直循环下去的,结果他正常结束了.我用的java8.

它进入死循环了,只不过后来main线程把ready修改成true后,new Thread()线程就退出了

ready=true;是照书上写的吗?

改成ready=false就会无限循环下去

我刚看到这个问题,你把while(!ready)的循环体中的sleep()去掉,改为“;”,让他空循环,试下,不行你看下虚拟机是不是server模式

package chapter2;

/**

  • Created by pfjia on 2017/5/5 0005.
    */
    public class NoVisibility {
    private static boolean ready = false;
    private static int number;

    private static class ReaderThread extends Thread {
    @Override
    public void run() {
    while (!ready) {

        }
        System.out.println(number);
    }
    

    }

    public static void main(String[] args) throws InterruptedException {
    ReaderThread rt = new ReaderThread();
    rt.start();

    Thread.sleep(1000);
    number = 42;
    ready = true;
    

    }
    }