public class NoVisibility { private static boolean ready;
private static int number;
private static class ReaderThread extends Thread { public void run() { while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) { new ReaderThread().start();
number = 42;
ready = true;
}
}NoVisibility可能会一直保持循环,因为对于读线程来说,ready的值可能永远不可见。甚至更奇怪的现象是,NoVisibility可能会打印0,因为早在对number赋值之前,主线程就已经写入ready并使之对读取线程可见,这是一种“重排序(reordering)”现象!
-------------------------------------------------------------------------------
以上是书“3.1 可见性”的一个例子,我想不明白的是,结果怎么会是“0”??
难道书中指的“重排序(reordering)”是将以下2句代码对调?请大侠赐教啊?想不明白。
number = 42;
ready = true;
感觉评论还不错的,想买本看的,现在有点犹豫了。谁还有其他java并发类的书推荐吗??