在看书过程中,看到一个可见性的例子,结果自己运行了一下,没有可见性的问题,这是为什么,也没加同步锁啊
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()线程就退出了
我刚看到这个问题,你把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;
}
}