完整代码如下,设想中是主线程不断查看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;