关于可见性的问题,谢谢老师!
来源:3-4 线程安全性-可见性
![](http://img1.sycdn.imooc.com/user/545865f0000198ee02200220-100-100.jpg)
慕神2874530
2019-04-10
老师,您好!我写了一个简单的程序测试可见性的这个东西,发现一个问题。
如下代码:大体流程就是,say方法中,while循环的跳出条件是closed==true,初始值为false。另外一个线程3秒后将其设置为true:
static class Test {
private boolean closed = false;
public static void main(String[] args) {
Test t = new Test();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000L);
} catch (Exception e) {
}
System.out.println("设置关闭");
t.close();
}
}).start();
t.say();
}
public void close() {
closed = true;
}
public void say() {
while (!closed) {
//System.out.println("say...");
}
System.out.println("closed");
}
}
现在的现象是,现在closed变量没有加volatile修饰,while循环体中如果没有代码,其它线程将closed修改为true之后,while循环是不会终止的,但是如果有代码(比如我上面加注释的输出),循环就会终止,这个是什么原因啊?难道循环体中有代码执行的时候,下次循环会从主存中读取新的closed的值,如果没有代码,就不会从主存读取新值吗?这个和volatile还没有关系,如果使用volatile修饰肯定没有问题。谢谢老师解答!!
写回答
2回答
-
慕神2874530
提问者
2019-04-10
老师,我好像知道了,System.out.println
方法里有synchronized修饰的代码块儿。。。。。。00 -
慕神2874530
提问者
2019-04-10
突然想起,和happened-before有关系吗?
00
相似问题
volatile的可见性
回答 1
内存屏障
回答 1