ConcurrentHashMap 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
支持检索的完全并发性和更新的高预期并发性的哈希表。
[Android.Runtime.Register("java/util/concurrent/ConcurrentHashMap", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })]
public class ConcurrentHashMap : Java.Util.AbstractMap, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IConcurrentMap
[<Android.Runtime.Register("java/util/concurrent/ConcurrentHashMap", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })>]
type ConcurrentHashMap = class
inherit AbstractMap
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IConcurrentMap
interface IMap
- 继承
- 属性
- 实现
注解
支持检索的完全并发性和更新的高预期并发性的哈希表。 此类遵循与 相同的功能规范 java.util.Hashtable
,并包含与 的每个方法对应的方法 Hashtable
版本。 但是,即使所有操作都是线程安全的,检索操作也不需要<><>锁定,并且<><>没有任何支持以阻止所有访问的方式锁定整个表。 此类与依赖于其线程安全但不依赖于其同步详细信息的程序中完全互 Hashtable
操作。
检索操作 (包括 get
) 通常不会阻止,因此可能与包括 put
和 remove
) (更新操作重叠。 检索反映最近<>完成<的>更新操作的结果,这些操作在开始时保持这些操作。 (更正式地说,给定密钥<><>的更新操作与报告更新的 value 的键的任何 (非 null) 检索关系。) 对于 和 clear
等putAll
聚合操作,并发检索可能仅反映插入或删除某些条目。 同样,迭代器、拆分器和枚举返回元素,这些元素反映哈希表在迭代器/枚举创建时或创建后的状态。 它们不会<><引发>java.util.ConcurrentModificationException ConcurrentModificationException
。 但是,迭代器设计为一次只能由一个线程使用。 请记住,包括 、 isEmpty
和 containsValue
的size
聚合状态方法的结果通常仅在映射未在其他线程中进行并发更新时才有用。 否则,这些方法的结果反映的暂时性状态可能足以用于监视或估计目的,但不适用于程序控制。
当 (冲突过多时,表会动态扩展,即,具有不同哈希代码但与表大小) 相同槽的键,其预期平均效果是,每个映射 (对应于重设大小) 的 0.75 负载因子阈值。 添加和删除映射时,此平均值可能存在很大的差异,但总体而言,这保持了哈希表的普遍接受的时间/空间权衡。 但是,调整此哈希表或任何其他类型的哈希表的大小可能是一个相对缓慢的操作。 如果可能,最好提供大小估计作为可选 initialCapacity
构造函数参数。 附加的可选 loadFactor
构造函数参数通过指定用于计算要为给定数量的元素分配的空间量时使用的表密度,提供了自定义初始表容量的进一步方法。 此外,为了与此类的早期版本兼容,构造函数可以选择性地指定预期的 concurrencyLevel
作为内部大小调整的附加提示。 请注意,使用具有相同 hashCode()
的许多键是降低任何哈希表性能的一种肯定方法。 为了减轻影响,当键为 Comparable
时,此类可以使用键之间的比较顺序来帮助打破联系。
Set
使用 或 () #newKeySet()
创建 ConcurrentHashMap 的投影时,可以使用 或 #newKeySet(int)
) 创建或查看 (#keySet(Object)
,并且映射值可能暂时 () 未使用,或者都采用相同的映射值。
ConcurrentHashMap 可用作可缩放的频率映射, (一种形式的直方图或多集) ,方法是使用 java.util.concurrent.atomic.LongAdder
值并通过 进行初始化 #computeIfAbsent computeIfAbsent
。 例如,若要向 添加计数 ConcurrentHashMap<String,LongAdder> freqs
,可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();
此类及其视图和迭代器实现 和 接口的所有 <em>可选</em> 方法Map
。Iterator
与 类似Hashtable
,但与 不同HashMap
,>此类不允许<<>null
用作键或值。
ConcurrentHashMaps 支持一组顺序和并行批量操作,与大多数Stream
方法不同,这些操作设计为安全且通常合理地应用,即使映射由其他线程同时更新;例如,在计算共享注册表中值的快照摘要时。 有三种类型的操作,每个操作都有四种形式,接受具有键、值、条目和 (键、值) 对的函数作为参数和/或返回值。 由于 ConcurrentHashMap 的元素不是以任何特定方式排序的,并且可以在不同的并行执行中按不同的顺序进行处理,因此所提供的函数的正确性不应依赖于任何排序,也不应依赖于在计算过程中可能暂时更改的任何其他对象或值;和 ,除了 forEach 操作,理想情况下应为无副作用。 对 Map.Entry
对象的批量操作不支持方法 setValue
。
<ul><li>forEach:对每个元素执行给定操作。 变体形式在执行操作之前对每个元素应用给定的转换。
<li>search:返回对每个元素应用给定函数的第一个可用非 null 结果;找到结果时跳过进一步搜索。
<li>reduce:累积每个元素。 提供的缩减函数不能更正式地依赖于排序 (,它应该是结合和交换性) 。 有五种变体:
<ul>
<李>平原减少。 (没有用于 (键、值) 函数参数的此方法形式,因为没有相应的返回类型。)
<li>映射缩减,累积应用于每个元素的给定函数的结果。
<li>使用给定基值缩减为标量双精度型、长型和 ints。
</ul></ul>
这些批量操作接受 参数 parallelismThreshold
。 如果当前映射大小估计小于给定阈值,则按顺序继续方法。 使用 值 Long.MAX_VALUE
可取消所有并行度。 使用 值 1
将分区到足够的子任务中,以充分利用 ForkJoinPool#commonPool()
用于所有并行计算的 ,从而产生最大并行度。 通常,你首先会选择其中一个极端值,然后测量使用中间值来权衡开销与吞吐量的性能。
批量操作的并发属性遵循 ConcurrentHashMap 的并发属性:从 get(key)
和相关访问方法返回的任何非 null 结果都与关联的插入或更新具有发生前的关系。 任何批量操作的结果都反映了这些每个元素关系的构成 (但不一定相对于整个映射而言是原子的,除非它以某种方式已知是静止的) 。 相反,由于映射中的键和值从不为 null,因此 null 充当当前缺少任何结果的可靠原子指示器。 为了维护此属性,null 用作所有非标量缩减操作的隐式基础。 对于 double、long 和 int 版本,基础应该是一个基础,当与任何其他值组合时,返回其他值 (更正式,它应该是缩减) 的标识元素。 最常见的缩减具有以下属性:例如,使用基数 0 计算总和,或使用基MAX_VALUE计算最小值。
作为参数提供的搜索和转换函数同样应返回 null,以指示缺少任何结果 (在这种情况下,它不会) 使用。 在映射缩减的情况下,这还允许转换充当筛选器,返回 null (;如果是基元专用化,则标识基础) (如果元素不应合并)。 在搜索或化简操作中使用复合转换和筛选之前,可以先根据此“null 意味着现在没有任何内容”规则自行编写复合转换和筛选。
接受和/或返回 Entry 参数的方法维护键值关联。 例如,在查找最大值的键时,它们可能很有用。 请注意,可以使用 提供 new AbstractMap.SimpleEntry(k,v)
“纯”条目参数。
批量操作可能会突然完成,引发在提供的函数的应用程序中遇到的异常。 处理此类异常时,请记住,其他并发执行的函数也可能引发异常,或者在未发生第一个异常时引发异常。
与顺序形式相比,并行加速是常见的,但不保证。 如果并行化计算的基础工作比计算本身更昂贵,则涉及小型映射上简短函数的并行操作的执行速度可能比顺序形式慢。 同样,如果所有处理器都忙于执行不相关的任务,则并行化可能不会产生太多的实际并行度。
所有任务方法的所有参数都必须为非 null。
此类是 Java 集合框架的成员。
在 1.5 中添加。
的 java.util.concurrent.ConcurrentHashMap
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
ConcurrentHashMap() |
创建一个新的空映射,默认初始表大小 (16) 。 |
ConcurrentHashMap(IDictionary) |
使用与给定映射相同的映射创建新映射。 |
ConcurrentHashMap(Int32) |
创建一个新的空映射,其初始表大小容纳指定数量的元素,而无需动态调整大小。 |
ConcurrentHashMap(Int32, Single) |
创建一个新的空映射,其初始表大小基于给定数量的元素 ( |
ConcurrentHashMap(Int32, Single, Int32) |
创建一个新的空映射,其初始表大小基于给定数量的元素 () |
ConcurrentHashMap(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsEmpty |
要添加 (继承自 AbstractMap) |
JniIdentityHashCode |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
JniPeerMembers |
支持检索的完全并发性和更新的高预期并发性的哈希表。 |
PeerReference |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
方法
显式接口实现
IJavaPeerable.Disposed() |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.Finalized() |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.JniManagedPeerState |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
支持检索的完全并发性和更新的高预期并发性的哈希表。 (继承自 Object) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
支持检索的完全并发性和更新的高预期并发性的哈希表。 |
GetJniTypeName(IJavaPeerable) |
支持检索的完全并发性和更新的高预期并发性的哈希表。 |