开发者社区> 问答> 正文

Java同步问题,线程之间进行通信

请看下面的代码。我知道为什么我不使用“同步”部分,循环永远不会中断,但是我不知道是为什么我使用“同步”部分,循环中断。似乎与之前发生的原则不符。

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";
}

}

展开
收起
小六码奴 2019-10-03 19:37:42 869 0
1 条回答
写回答
取消 提交回答
  • 这不是偶然的情况,而是一个可见性问题。使svolatile也起作用,使值更改对线程可见,而不是使用缓存的值。

    从Java内存模型的POV看,使用同步方式是不正确的。test分配时,您还需要同步test.s = "break";。但是,由于底层的x86体系结构,您的同步代码有效,即使使用NOOP同步块,该体系结构也似乎刷新了缓存。

    2019-10-09 16:04:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
从《阿里巴巴Java开发手册》编写推广谈技术成长 立即下载
如何通过 Serverless 提高 Java 微服务治理效 立即下载
多IO线程优化版 立即下载