gpt4 book ai didi

Java同步问题,线程间通信

转载 作者:行者123 更新时间:2023-12-02 09:27:49 25 4
gpt4 key购买 nike

请看下面的代码。我知道为什么我不使用“同步”部分,循环永远不会中断,但我不知道为什么我使用“同步”部分,循环会中断。这似乎不符合 Happens-Before 原则。请帮帮我,非常感谢。

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

}

最佳答案

这不是先发生的情况,而是可见性问题。使 s 可变也可以,使值更改对线程可见,而不是使用缓存的值。

从 Java 内存模型的 POV 来看,使用您正在使用的同步方式是不正确的。在分配 test.s = "break"; 时,您还需要同步 test。但是,您的同步代码可以工作是因为底层 x86 架构,即使使用 NOOP 同步块(synchronized block)也会影响可见性。

关于Java同步问题,线程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com