当前位置: 代码迷 >> J2SE >> 关于线程的一个有关问题
  详细解决方案

关于线程的一个有关问题

热度:73   发布时间:2016-04-24 02:11:35.0
关于线程的一个问题
Java code
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的值不可见?


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

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