gpt4 book ai didi

java - concurrentHashMap putIfAbsent 方法功能

转载 作者:行者123 更新时间:2023-11-29 09:44:25 26 4
gpt4 key购买 nike

我是 Java 世界的新手,正在探索 concurrentHashMap,在探索 concurrentHashMap API 时,我发现了 putifAbsent()方法

public V putIfAbsent(K paramK, V paramV)
{
if (paramV == null)
throw new NullPointerException();
int i = hash(paramK.hashCode());
return segmentFor(i).put(paramK, i, paramV, true);
}

现在请告知它的功能是什么,我们什么时候实际需要它,如果可能的话请用一个简单的小例子来解释。

最佳答案

一个ConcurrentHashMap被设计成可以被大量并发的Thread使用。

现在,如果您使用标准 Map 接口(interface)提供的方法,您可能会这样写

  if(!map.containsKey("something")) {
map.put("something", "a value");
}

这看起来不错并且似乎可以完成工作,但是它不是线程安全的。所以你会想,“啊,但我知道 synchronized 关键字”并将其更改为这个

  synchronized(map) {
if(!map.containsKey("something")) {
map.put("something", "a value");
}
}

这解决了问题。

现在您所做的是锁定整个 map 以供读取和写入,同时检查 key 是否存在,然后将其添加到 map 。

这是一个非常粗糙的解决方案。现在您可以通过双重检查锁和重新锁定 key 等来实现您自己的解决方案,但这是很多非常复杂的代码,很容易出现错误。

因此,您改为使用 JDK 提供的解决方案。

ConcurrentHashMap 是一个巧妙的实现,它将 Map 划分为区域并分别锁定它们,这样您就可以并发、线程安全地读取和写入 map 而无需外部锁定。

与实现中的所有其他方法一样,putIfAbsent 锁定键的区域而不是整个 Map,因此允许其他事情同时在其他区域进行。

关于java - concurrentHashMap putIfAbsent 方法功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850803/

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