gpt4 book ai didi

java - 并发java

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

static ConcurrentHashMap k;

X x;
//line 3:
synchronized(k){ x = k.get("LL");}

// line 5

// line 12:
synchronized(k){if(x.b){x.b = false;}}

“k”是共享 map 。当线程 1 在第 5 行时,第一个线程经过第 3 行,第二个线程经过第 3 行,线程 1 将 x.b 更改为 false,线程 2 看到什么 x.b?第 5 行旨在显示线程 2 在线程 1 进入第二个同步块(synchronized block)之前获取其 x

最佳答案

您对术语“第一线程”和“第二线程”的指定有些过度;您的问题假设第一个进入第一个 synchronized block 的线程也将是第一个进入第二个 synchronized block 的线程,但实际上没有理由期待这一点。

但是,第一个 synchronized block 不会执行任何非常相关或有趣的操作 - 代码片段中没有任何内容会改变 k,并且第一个 synchronized block 只是访问它 - 所以我将忽略它是同步这一事实。这将稍微简化定义:现在“第一个线程”表示进入第二个同步块(synchronized block)的第一个线程,“第二个线程”表示进入第二个同步块(synchronized block)的第二个线程> 阻止。 (到目前为止还好吗?)定义的问题不存在了。 。 .

假设不可能有其他线程进入并将 x.b 设置为 true — 或者就这一点而言,不可能有第一个线程进入线程这样做,在您引用的代码片段之后的代码中 - 同样,由于其他地方发生的事情,两个线程不可能为 k.get("LL") 获得完全不同的结果 -那么第二个线程将把 x.b 视为 false,正如人们天真的期望的那样。这是因为

If one action happens-before another, then the first is visible to and ordered before the second.

An unlock on a monitor happens-before every subsequent lock on that monitor.

(以上引文均来自 §17.5.5 of The Java Language Specification, Java SE 7 Edition ;请参阅该部分及其之前的部分,了解更多形式。)

关于java - 并发java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215605/

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