主线程对sign变量值的改变没有反应

完整代码如下,设想中是主线程不断查看sign变量,如果为真那么打印出“收到!”,而新建线程在2s后将sign置为真,那么这时候主线程应该打印出“收到!”了,而实际上什么也没发生。

谢谢

 class Message
{
    private boolean sign = false;
    public void setSign(boolean x)
    {
        sign = x;
    }
    public boolean getSign()
    {
        return sign;
    }
}
public class Y2017Aug22 {

    public static void main(String args[])
    {
        Message message = new Message();
        Thread thread = new Thread(new Runnable(){

            @Override
            public void run() {
                try {
                    //2s后发送信号
                    Thread.sleep(2000);
                    message.setSign(true);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                //循环等待
                while(true);
            }

        });
        thread.start();
        //不断检查是否有信号
        while(true)
        {
            if(message.getSign())
            {
                System.out.println("收到!");        
                break;
            }
        }
    }
}

java中每个线程都会有自己的工作内存,线程总会把共享变量copy到自己的工作内存缓存起来,以后的多次读取都直接使用工作内存中的缓存,如果想要将共享变量的更改里面对其他线程可以,需要使用volatile关键字修饰。建议您去学习一下java的内存模型,以及volatile的内存语义

加上volatile保证可见性

 private volatile boolean sign = false;