我试图找到答案,但无法在谷歌或Java文档中找到答案。
案例1:在ConcurrentHashMap中,假设线程t1正在从段n中读取,而在相同的线程中,t2希望在相同的段n上写入:
问题1:,这两个操作是一个接一个,还是会同时执行?
案例2:在ConcurrentHashMap中,假设线程t1正在段n上写入,而在相同的线程中,t2希望从相同的段n中读取,
问题2:,这两个操作是一个接一个,还是会同时执行?
发布于 2013-04-19 14:31:49
我认为javadoc回答了您的两个问题:
检索操作(包括get)一般不阻塞,因此可能与更新操作(包括put和remove)重叠。检索结果反映了最近完成的更新操作的结果。对于聚合操作(如putAll和clear ),并发检索可能只反映某些条目的插入或删除。
分段用于更新操作:
update操作之间允许的并发性由可选的concurrencyLevel构造函数参数(默认为16)指导,该参数用作内部大小调整的提示。
因此,简而言之,读取不会被阻塞(它是作为读取易失性变量实现的)。如果它们在同一段中写入,它们可能会相互阻塞。
发布于 2017-09-26 11:25:38
据ConcurrentHashMap甲骨文博士说,
ConcurrentHashMap的构造函数如下所示:
public ConcurrentHashMap (int initialCapacity,float loadFactor,int concurrencyLevel)
因此,上面的行创建了一个具有指定初始容量、负载因子和并发级别的新的空映射。其中,ConcurrentHashMap构造器需要考虑的重要参数:
在ConcurrentHashMap Api中,您将找到以下常量。
默认情况下,ConcurrentHashMap构造函数(或对象)的初始容量参数和并发级别参数设置为16。
因此,ConcurrentHashMap不维护映射范围的锁,而是维护一个默认的16锁列表(锁的数量等于初始容量,默认为16),每个锁都用于锁定Map.This的单个桶,这表明16个线程(线程数等于默认的16)可以同时修改集合,假设每个线程在不同的桶上工作。因此,与哈希表不同,我们执行任何类型的操作(更新、删除、读取、创建),而不锁定ConcurrentHashMap中的整个映射。
检索操作(包括get)一般不会阻塞。在本例中,它使用了易失性的概念。,因此可能与更新操作(包括put和remove)重叠。检索结果反映了最近完成的更新操作的结果。
update操作之间允许的并发性由可选的concurrencyLevel构造函数参数(默认为16)指导,该参数用作内部大小调整的提示。表在内部进行分区,以便允许指定的无争用的并发更新数量。因为哈希表中的位置本质上是随机的,所以实际的并发性会有所不同。理想情况下,您应该选择一个值来容纳尽可能多的线程同时修改表。使用比需要高得多的值可能会浪费空间和时间,而较低的值会导致线程争用。
希望能帮上忙!
https://stackoverflow.com/questions/16105554
复制相似问题