tun*_*fdg 1 java concurrenthashmap
我是java世界的新bie并探索并发哈希映射,在探索并发hashmap 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);
}
Run Code Online (Sandbox Code Playgroud)
现在请告知它的功能是什么,我们什么时候需要它,如果可能的话请用一个简单的小例子来解释.
Bor*_*der 12
A ConcurrentHashMap的设计使其可以被大量并发Threads使用.
现在,如果你使用标准Map接口提供的方法,你可能会写这样的东西
if(!map.containsKey("something")) {
map.put("something", "a value");
}
Run Code Online (Sandbox Code Playgroud)
这看起来不错,似乎可以完成这项工作,但它不是线程安全的.所以你会想,"啊,但我知道synchronized关键字"并将其更改为此
synchronized(map) {
if(!map.containsKey("something")) {
map.put("something", "a value");
}
}
Run Code Online (Sandbox Code Playgroud)
哪个解决了这个问题.
现在你所做的是锁定整个地图以进行读写,同时检查密钥是否存在,然后将其添加到地图中.
这是一个非常粗糙的解决方案.现在,你可以实现双重检查锁和重新锁定在键等自己的解决方案,但是这是一个很大的非常复杂的代码,这是非常容易出现错误.
因此,您使用JDK提供的解决方案.
这ConcurrentHashMap是一个聪明的实现,它将Map区域分开并单独锁定它们,以便您可以在没有外部锁定的情况下对映射进行并发,线程安全,读取和写入.
与实现中的所有其他方法一样,putIfAbsent锁定密钥的区域而不是整体Map,因此在此期间允许其他区域继续执行其他操作.
| 归档时间: |
|
| 查看次数: |
5488 次 |
| 最近记录: |