gpt4 book ai didi

java - ConcurrentHashMap 和复合操作

转载 作者:搜寻专家 更新时间:2023-10-30 21:15:30 25 4
gpt4 key购买 nike

Hashtable 和 Collections.synchronizedMap 是线程安全的,但仍然是像这样的复合操作

if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}

需要外部同步为:

synchronized(map_obj) {
if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}
}

假设我们有 ConcurrentHashMap(CHM) 而不是 Hashtable 或 HashMap。 CHM 为上述复合操作提供了一个替代方法putIfAbsent(),从而消除了外部同步的需要。

但是假设没有CHM提供的putIfAbsent()。那我们是不是可以写下面的代码:

synchronized(concurrenthashmap_obj) {
if (!concurrenthashmap_obj.containsKey(key)) {
concurrenthashmap_obj.put(key, value);
}
}

我的意思是我们可以在 CHM 对象上使用外部同步吗?可以吗?

对于上述复合操作,CHM 中有 putIfAbsent() 方法,但是如果我们使用 CHM,我们如何为其他复合操作 实现线程安全。我的意思是我们可以在 CHM 对象上使用外部同步吗?

最佳答案

不,您不能使用外部同步来确保 ConcurrentHashMap 上的复合操作的原子性。

准确地说,您可以使用外部同步来确保复合操作的原子性,但前提是使用 ConcurrentHashMap 的所有操作也在同一锁上同步(尽管使用 ConcurrentHashMap 在这种情况下没有意义 - 您可以将其替换为常规 HashMap)。

外部同步方法适用于 HashtableCollections.synchronizedMap() 只是因为它们保证它们的原始操作在这些对象上是同步的以及。由于 ConcurrentHashMap 不提供此类保证,原始操作可能会干扰复合操作的执行,从而破坏它们的原子性。

但是,ConcurrentHashMap 提供了许多可用于以乐观方式实现复合操作的方法:

  • putIfAbsent(键, 值)
  • 删除(键,值)
  • 替换(键,值)
  • 替换(键,旧值,新值)

您可以使用这些操作来实现某些复合操作而无需显式同步,就像您对 AtomicReference 等所做的那样。

关于java - ConcurrentHashMap 和复合操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658335/

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