首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentHashMap读写锁

ConcurrentHashMap读写锁
EN

Stack Overflow用户
提问于 2013-04-19 13:17:08
回答 2查看 36.1K关注 0票数 29

我试图找到答案,但无法在谷歌或Java文档中找到答案。

案例1:在ConcurrentHashMap中,假设线程t1正在从段n中读取,而在相同的线程中,t2希望在相同的段n上写入:

问题1:,这两个操作是一个接一个,还是会同时执行?

案例2:在ConcurrentHashMap中,假设线程t1正在段n上写入,而在相同的线程中,t2希望从相同的段n中读取,

问题2:,这两个操作是一个接一个,还是会同时执行?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-19 14:31:49

我认为javadoc回答了您的两个问题:

检索操作(包括get)一般不阻塞,因此可能与更新操作(包括put和remove)重叠。检索结果反映了最近完成的更新操作的结果。对于聚合操作(如putAll和clear ),并发检索可能只反映某些条目的插入或删除。

分段用于更新操作:

update操作之间允许的并发性由可选的concurrencyLevel构造函数参数(默认为16)指导,该参数用作内部大小调整的提示。

因此,简而言之,读取不会被阻塞(它是作为读取易失性变量实现的)。如果它们在同一段中写入,它们可能会相互阻塞。

票数 31
EN

Stack Overflow用户

发布于 2017-09-26 11:25:38

据ConcurrentHashMap甲骨文博士说,

ConcurrentHashMap的构造函数如下所示:

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

因此,上面的行创建了一个具有指定初始容量、负载因子和并发级别的新的空映射。其中,ConcurrentHashMap构造器需要考虑的重要参数:

  • initialCapacity -初始容量。该实现执行内部大小调整以适应这许多元素。
  • concurrencyLevel -并发更新线程的估计数。该实现执行内部大小调整,以尝试容纳这么多线程。

在ConcurrentHashMap Api中,您将找到以下常量。

  • 静态最终int DEFAULT_INITIAL_CAPACITY = 16;
  • 静态最终int DEFAULT_CONCURRENCY_LEVEL = 16;

默认情况下,ConcurrentHashMap构造函数(或对象)的初始容量参数和并发级别参数设置为16。

因此,ConcurrentHashMap不维护映射范围的锁,而是维护一个默认的16锁列表(锁的数量等于初始容量,默认为16),每个锁都用于锁定Map.This的单个桶,这表明16个线程(线程数等于默认的16)可以同时修改集合,假设每个线程在不同的桶上工作。因此,与哈希表不同,我们执行任何类型的操作(更新、删除、读取、创建),而不锁定ConcurrentHashMap中的整个映射。

检索操作(包括get)一般不会阻塞。在本例中,它使用了易失性的概念。,因此可能与更新操作(包括put和remove)重叠。检索结果反映了最近完成的更新操作的结果。

update操作之间允许的并发性由可选的concurrencyLevel构造函数参数(默认为16)指导,该参数用作内部大小调整的提示。表在内部进行分区,以便允许指定的无争用的并发更新数量。因为哈希表中的位置本质上是随机的,所以实际的并发性会有所不同。理想情况下,您应该选择一个值来容纳尽可能多的线程同时修改表。使用比需要高得多的值可能会浪费空间和时间,而较低的值会导致线程争用。

希望能帮上忙!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16105554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档