Java中的 ConcurrentHashMap?
在Java中有什么用?它有什么好处?它是如何工作的?示例代码也很有用。ConcurrentHashMap
在Java中有什么用?它有什么好处?它是如何工作的?示例代码也很有用。ConcurrentHashMap
关键是要提供线程安全的实现。多个线程可以读取和写入它,而不会收到过期或损坏的数据。 提供自己的同步,因此您不必显式同步对它的访问。HashMap
ConcurrentHashMap
的另一个功能是它提供了方法,如果指定的键不存在,该方法将以原子方式添加映射。请考虑以下代码:ConcurrentHashMap
putIfAbsent
ConcurrentHashMap<String, Integer> myMap = new ConcurrentHashMap<String, Integer>();
// some stuff
if (!myMap.contains("key")) {
myMap.put("key", 3);
}
此代码不是线程安全的,因为另一个线程可以在对 的调用和对 的调用之间添加映射。正确的实现是:"key"
contains
put
myMap.putIfAbsent("key", 3);
ConcurrentHashMap
允许并发访问地图。HashTables也提供对地图的同步访问,但您的整个地图被锁定以执行任何操作。
ConcurrentHashMap背后的逻辑是,但只有部分[]。每个段管理自己的哈希表。锁定仅适用于更新。在检索的情况下,它允许完全并发。your entire table is not getting locked
segments
假设四个线程同时处理容量为 32 的映射,该表被划分为四个段,其中每个段管理一个容量哈希表。默认情况下,集合维护一个包含 16 个段的列表,每个段用于保护(或锁定)地图的单个存储桶。
这实际上意味着 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 traversing
contains
put