public class ThreadTest {
private static boolean ready;
private static int number;

private static class ReaderThread extends Thread {
/* (non-Javadoc)
 * @see java.lang.Thread#run()
 */
public void run() {
while(!ready) {
Thread.yield();
System.out.println(number);
}
}
} /**
 * @param args
 */
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = false; }}
ReaderThread可能会一直保持循环,因为对于ReaderThread来说,ready的值可能永远不可见。为什么对于ReaderThread来说ready的值不可见?

解决方案 »

  1.   

    晕死,是我敲错了,应该是number = 42;
    ready = true;
    这样的话我测试了好几遍,都不会像书上说的一直保持循环,但是《java并发编程实践》里面的“那句ready的值可能永远不可见”是什么意思。
      

  2.   

    这根java的内存模型有关系。这样:
    private volatile static boolean ready;
    volatile可以保证可见性。
      

  3.   

    java里面的内存分为主存储器和工作存储器,主存是所有的线程所共享的,工作存储器是各个线程私有的。线程不能直接操作工作存储器的数据,它首先把主存的数据拷贝到工作存储器,然后直接操作工作存储器的拷贝,等到合适的时候再回写到主存里面。因此,多个线程的工作存储器的数据很有可能是不一致的,一个线程并不会及时的看到其他的线程对数据的修改。
      

  4.   

    ready和number两个变量,你在ReaderThread 中使用的时候用的是这两个变量的拷贝,在main Thread中也是一个拷贝,并不是直接操作这两个变量,所以会出现你在main thread中修改了这两个变量的值,但是ReaderThread却“看”不到main thread做的修改。这就是“可见性”。
      

  5.   

    shit,打开的时候连还有沙发,现在连地板都么得了