gpt4 book ai didi

java - java.util.concurrent.ConcurrentHashMap.putIfAbsent 是否需要在同步块(synchronized block)中?

转载 作者:搜寻专家 更新时间:2023-11-01 01:17:18 25 4
gpt4 key购买 nike

我正在尝试追踪竞争条件,所有迹象似乎都指向 ConcurrentHashMap.putIfAbsent()。如果 2 个线程使用相同的键在空 map 上调用 putIfAbsent() 是否有可能,这两个线程都可以进行查找以查看该键尚不存在,然后两个线程都尝试添加它?出于某种原因,当我第一次开始使用 putIfAbsent() 时,我认为调用不需要同步。但是现在我看不出如果时机合适的话它会如何阻止两个线程添加它们的值。我无法在生产之外重现这一点。

谢谢

最佳答案

任何并发集合的操作都不需要使用同步。

这是设计使然,实际上锁定集合对其他操作没有影响。 (除非它们也被锁定)在这种情况下,它会使它们变慢。

Is it possible that if 2 threads call putIfAbsent() on an empty map with the same key that both could do their lookup to see that the key does not exist yet so both threads then try to add it?

两者都可以尝试,但只有一个会成功。两个线程似乎都已成功是不可能的。

For some reason when I first started using putIfAbsent() I did not think the call would need to be synchronized.

不是。

But now I can't see how it would prevent both threads from adding their values if the timing was right.

它执行 CAS operation在代码中,这意味着只有一个操作可以成功,线程将知道是哪一个。 CAS 操作不需要锁定,因为它使用底层汇编指令来执行此操作。事实上,您通常会使用 CAS 操作来实现锁定,而不是相反。

关于java - java.util.concurrent.ConcurrentHashMap.putIfAbsent 是否需要在同步块(synchronized block)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330444/

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