并发hashMap putIfAbsent方法功能

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,因此在此期间允许其他区域继续执行其他操作.