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
版本。 但是,尽管所有操作都是线程安全的,但检索操作不会<<>/em> 需要锁定,并且<>对于<>锁定整个表没有任何支持,从而阻止所有访问。 此类在依赖于线程安全性但不依赖于其同步详细信息的程序中完全可 Hashtable
互操作。
检索操作(包括 get
)通常不会阻止,因此可能与更新操作(包括 put
和 remove
)重叠。 检索反映了最近 <em>completed</em> 更新操作在启动时保留的结果。 (更正式地说,给定密钥的更新操作包含 <em 与报告更新值的任何(非 null)检索的 em>之前</em> 关系。 对于聚合操作(例如 putAll
和 clear
),并发检索可能仅反映插入或删除某些条目。 同样,迭代器、拆分器和枚举返回元素,这些元素反映某个时间点或自创建迭代器/枚举以来哈希表的状态。 它们不会<></em> 引发java.util.ConcurrentModificationException ConcurrentModificationException
。 但是,迭代器设计为一次只能由一个线程使用。 请记住,聚合状态方法的结果,size
isEmpty
并且containsValue
通常仅在映射在其他线程中不进行并发更新时才有用。 否则,这些方法的结果反映暂时性状态,这些状态可能足以用于监视或估计目的,但不适用于程序控制。
当存在过多的冲突(即具有不同哈希代码但属于表大小的同一槽模式的键)时,表将动态扩展,每个映射的预期平均效果约为两个箱(对应于重设大小的 0.75 负载因子阈值)。 添加和删除映射时,此平均值可能存在很大的差异,但总体而言,这保持了哈希表通常接受的时间/空间权衡。 但是,调整此哈希表或任何其他类型的哈希表的大小可能是一个相对缓慢的操作。 如果可能,最好提供大小估计作为可选 initialCapacity
构造函数参数。 另一个可选的 loadFactor
构造函数参数通过指定要用于计算为给定数量的元素分配的空间量,来进一步自定义初始表容量。 此外,为了与此类的早期版本兼容,构造函数可以选择将预期 concurrencyLevel
指定为内部大小调整的其他提示。 请注意,使用许多键完全相同 hashCode()
是降低任何哈希表性能的一种肯定方法。 为了缓解影响,当键是 Comparable
时,此类可以使用键之间的比较顺序来帮助断开关系。
Set
可以创建 ConcurrentHashMap 的投影(使用#newKeySet()
或#newKeySet(int)
)或查看(仅当仅关注键时使用#keySet(Object)
),并且映射的值(可能暂时未使用)或全部采用相同的映射值。
ConcurrentHashMap 可以使用值和初始化#computeIfAbsent computeIfAbsent
值作为可缩放的频率映射(直方图或多集java.util.concurrent.atomic.LongAdder
形式)。 例如,若要向 a ConcurrentHashMap<String,LongAdder> freqs
添加计数,可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();
此类及其视图和迭代器实现所有 <em>optional</em> 方法 Map
以及 Iterator
接口。
与Hashtable
但与不同HashMap
,此类不<><允许null
用作键或值。>
ConcurrentHashMaps 支持一组顺序和并行大容量操作,与大多数 Stream
方法不同,这些操作设计为安全且通常明智地应用,即使使用其他线程同时更新的映射也是如此;例如,计算共享注册表中值的快照摘要时。 有三种类型的操作,每个形式有四种,接受具有键、值、条目和(键、值)对的函数作为参数和/或返回值。 由于 ConcurrentHashMap 的元素不是以任何特定方式排序的,并且可以在不同的并行执行中按不同的顺序进行处理,因此所提供的函数的正确性不应取决于任何排序,也不应依赖于计算正在进行时可能暂时更改的任何其他对象或值;除了 forEach 操作,最好是无副作用。 对 Map.Entry
对象的批量操作不支持方法 setValue
。
<ul><li>forEach:对每个元素执行给定操作。 在执行操作之前,变体窗体对每个元素应用给定的转换。
<li>search:返回对每个元素应用给定函数的第一个可用非 null 结果;在找到结果时跳过进一步搜索。
<li>reduce:累积每个元素。 提供的减少功能不能依赖于排序(更正式,它应该是关联和通勤的)。 有五个变体:
<ul>
<李>平原减少。 (由于没有相应的返回类型,因此没有此方法用于(键、值)函数参数。
<li>Mapped reductions that accumulate the results of a given function applied to each element.
<li>Reductions to scalar doubles, longs, and ints, using a given basis value.
</ul></ul>
这些批量操作接受参数 parallelismThreshold
。 如果估计当前映射大小小于给定阈值,则方法会按顺序继续。 使用一 Long.MAX_VALUE
个值可抑制所有并行度。 通过将分区到足够的子任务来充分利用ForkJoinPool#commonPool()
用于所有并行计算的结果值1
,实现最大并行度。 通常,你最初会选择其中一个极端值,然后测量使用在值之间权衡开销与吞吐量的性能。
大容量操作的并发属性遵循 ConcurrentHashMap 的并发属性:从 get(key)
相关访问方法返回的任何非 null 结果都与关联的插入或更新具有发生前的关系。 任何批量操作的结果都反映了这些每个元素关系的构成(但并不一定是整体地图的原子性,除非已知是静止的)。 相反,由于映射中的键和值从不为 null,null 用作当前缺少任何结果的可靠原子指示器。 为了维护此属性,null 作为所有非标量减少操作的隐式基础。 对于双精度、长版本和 int 版本,基础应为一个,当与任何其他值结合使用时,返回其他值(更正式,它应该是减少的标识元素)。 最常见的减少具有这些属性;例如,使用基数 0 或以基数计算最小值的总和MAX_VALUE。
作为参数提供的搜索和转换函数应同样返回 null,以指示缺少任何结果(在这种情况下不使用它)。 在映射减少的情况下,这还允许转换充当筛选器,如果不应组合元素,则返回 null(或者,在基元专用化的情况下为标识基数)。 在搜索或化简操作中使用它们之前,可以自行根据此“null”规则创建复合转换和筛选。
接受和/或返回 Entry 参数的方法维护键值关联。 例如,当查找最大值的键时,它们可能很有用。 请注意,可以使用 “plain” Entry 参数提供 new AbstractMap.SimpleEntry(k,v)
。
批量操作可能会突然完成,引发在提供函数的应用程序中遇到的异常。 请记住,处理其他并发执行的函数可能也引发异常的此类异常,或者如果第一个异常未发生,则这样做。
与顺序形式相比,并行加速是常见的,但不能保证。 如果用于并行化计算的基础工作比计算本身更昂贵,则涉及小型映射上简短函数的并行操作的执行速度可能会比顺序形式慢。 同样,如果所有处理器都忙于执行不相关的任务,则并行化可能不会带来太多的实际并行度。
所有任务方法的所有参数都必须为非 null。
此类是 Java 集合框架的成员。
在 1.5 中添加。
适用于 . 的 java.util.concurrent.ConcurrentHashMap
Java 文档
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。
构造函数
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) |
一个哈希表,支持完整并发检索和更新预期的高并发性。 |