Java中的 ConcurrentHashMap?

2022-08-31 15:51:30

在Java中有什么用?它有什么好处?它是如何工作的?示例代码也很有用。ConcurrentHashMap


答案 1

关键是要提供线程安全的实现。多个线程可以读取和写入它,而不会收到过期或损坏的数据。 提供自己的同步,因此您不必显式同步对它的访问。HashMapConcurrentHashMap

的另一个功能是它提供了方法,如果指定的键不存在,该方法将以原子方式添加映射。请考虑以下代码:ConcurrentHashMapputIfAbsent

ConcurrentHashMap<String, Integer> myMap = new ConcurrentHashMap<String, Integer>();

// some stuff

if (!myMap.contains("key")) {
  myMap.put("key", 3);
}

此代码不是线程安全的,因为另一个线程可以在对 的调用和对 的调用之间添加映射。正确的实现是:"key"containsput

myMap.putIfAbsent("key", 3);

答案 2

ConcurrentHashMap允许并发访问地图。HashTables也提供对地图的同步访问,但您的整个地图被锁定以执行任何操作。

ConcurrentHashMap背后的逻辑是,但只有部分[]。每个段管理自己的哈希表。锁定仅适用于更新。在检索的情况下,它允许完全并发。your entire table is not getting lockedsegments

假设四个线程同时处理容量为 32 的映射,该表被划分为四个段,其中每个段管理一个容量哈希表。默认情况下,集合维护一个包含 16 个段的列表,每个段用于保护(或锁定)地图的单个存储桶。

enter image description here

这实际上意味着 16 个线程可以一次修改集合。可以使用可选的并发级别构造函数参数来增加此并发级别

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor, int concurrencyLevel)

正如另一个答案所述,ConcurrentHashMap提供了类似于put的新方法,只是如果密钥存在,则该值不会被覆盖。putIfAbsent()

private static Map<String,String> aMap =new ConcurrentHashMap<String,String>();

if(!aMap.contains("key"))
   aMap.put("key","value");

新方法也更快,因为它避免了如上所述。 方法必须找到段并迭代表以查找键,并且该方法必须再次遍历存储桶并放置键。double traversingcontainsput


推荐