请看下面的代码。我知道为什么我不使用“同步”部分,循环永远不会中断,但是我不知道是为什么我使用“同步”部分,循环中断。似乎与之前发生的原则不符。
public class Test implements Runnable {
private String s = "continue";
@Override
public void run() {
while (!"break".equals(this.s)) {
//synchronized (this){
//
//}
}
System.out.println("loop has been breaked!");
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
Thread t1 = new Thread(test);
t1.start();
TimeUnit.SECONDS.sleep(1);
test.s = "break";
}
}
这不是偶然的情况,而是一个可见性问题。使svolatile也起作用,使值更改对线程可见,而不是使用缓存的值。
从Java内存模型的POV看,使用同步方式是不正确的。test分配时,您还需要同步test.s = "break";。但是,由于底层的x86体系结构,您的同步代码有效,即使使用NOOP同步块,该体系结构也似乎刷新了缓存。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。