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> 更新作業在啟動時所持有的結果。 (更正式的是,指定索引鍵的更新作業會與 <報告更新值之任何 (非 Null) 擷取的 em>發生前</em> 關聯性。 針對 和 clear
等putAll
匯總作業,並行擷取可能會反映只插入或移除某些專案。 同樣地,Iterators、Spliterators 和 Enumerations 會傳回元素,以反映哈希表在某個時間點或自建立反覆運算器/列舉之後的狀態。 它們不會<></em> 擲回 java.util.ConcurrentModificationException ConcurrentModificationException
。 不過,反覆運算器是設計成一次只能由一個線程使用。 請記住,匯總狀態方法的結果,包括 size
、 isEmpty
和 containsValue
通常只有在對應未在其他線程中同時進行更新時才有用。 否則,這些方法的結果會反映暫時性狀態,這些狀態可能足以用於監視或估計目的,但不適用於程式控制。
當發生太多衝突時,數據表會動態展開(也就是具有相異哈希碼但落入數據表大小的相同位置模數的索引鍵),且每個對應大約維護兩個間隔的預期平均效果(對應至重設大小的0.75負載因數臨界值)。 新增和移除對應時,此平均值可能會有很多差異,但整體而言,這會維護哈希表通常接受的時間/空間取捨。 不過,調整這個或任何其他哈希表的大小可能是相對緩慢的作業。 可能的話,最好提供大小估計做為選擇性 initialCapacity
建構函式自變數。 額外的選擇性 loadFactor
建構函式自變數提供進一步的自定義初始數據表容量的方法,方法是指定要用於計算要配置給指定項目數目的空間量。 此外,為了與這個類別的舊版相容,建構函式可以選擇性地指定預期 concurrencyLevel
做為內部重設大小的額外提示。 請注意,使用許多索引鍵與 完全相同 hashCode()
,是減緩任何哈希表效能的一個肯定方式。 為了改善影響,當索引鍵為 Comparable
時,這個類別可能會使用索引鍵之間的比較順序來協助中斷系結。
Set
可能會建立 ConcurrentHashMap 的投影(使用 #newKeySet()
或 #newKeySet(int)
),或檢視 (#keySet(Object)
只有在只有感興趣的索引鍵時使用,而對應的值可能是暫時未使用,或全部都採用相同的對應值。
ConcurrentHashMap 可做為可調整的頻率對應(直方圖或多重集形式),方法是使用 java.util.concurrent.atomic.LongAdder
值並透過 #computeIfAbsent computeIfAbsent
初始化。 例如,若要將計數新增至 ConcurrentHashMap<String,LongAdder> freqs
,您可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();
這個類別及其檢視和反覆運算器會實作 和 Iterator
介面的所有 <em> 選擇性</em> 方法Map
。
和 Hashtable
不同,HashMap
這個類別不會<<>/em> 允許null
當做索引鍵或值使用。
ConcurrentHashMaps 支援一組循序和平行大量作業,與大多數 Stream
方法不同,設計成安全且通常很合理地套用到其他線程同時更新的對應;例如,計算共用登錄中值的快照集摘要時。 有三種作業類型,各有四種形式,接受具有索引鍵、值、專案和(索引鍵、值)組的函式做為自變數和/或傳回值。 因為 ConcurrentHashMap 的元素不會以任何特定方式排序,而且可以在不同的平行執行中以不同的順序處理,因此提供函式的正確性不應取決於任何排序,或可能暫時變更計算時可能暫時變更的任何物件或值;和 除了 forEach 動作以外,最好是無副作用。 物件上的 Map.Entry
大量作業不支援 方法 setValue
。
<ul><li>forEach:在每個元素上執行指定的動作。 變數窗體會在執行動作之前,在每個元素上套用指定的轉換。
<li>search:傳回在每個元素上套用指定函式的第一個可用非 Null 結果;在找到結果時略過進一步搜尋。
<li>reduce:累積每個元素。 提供的縮減函式不能依賴排序(更正式,它應該是關聯性和通勤性)。 有五個變體:
<ul>
<李>平原縮減。 (由於沒有對應的傳回型別,因此沒有這個方法的型別(索引鍵、值)函式自變數。
<li>對應縮減會累積套用至每個元素之指定函式的結果。
<li>會使用指定的基值,縮減為純量雙精度浮點數、longs 和 int。
</ul></ul>
這些大量作業接受自 parallelismThreshold
變數。 如果目前的地圖大小估計小於指定的臨界值,則方法會循序進行。 使用的值 Long.MAX_VALUE
會隱藏所有平行處理原則。 藉由將數據分割成足夠的子工作,以充分利用ForkJoinPool#commonPool()
用於所有平行計算的 ,以產生最大平行處理原則的值1
。 一般而言,您一開始會選擇其中一個極端值,然後測量使用介於值之間的效能,以取捨額外負荷與輸送量。
大量作業的並行屬性會遵循 ConcurrentHashMap 的並行屬性:從 get(key)
傳回的任何非 Null 結果,以及相關的存取方法都會與相關聯的插入或更新產生前置關聯性。 任何大量作業的結果都會反映這些每個元素關聯性的組成(但不一定是整體對應不可部分完成的,除非以某種方式已知為靜止)。 相反地,由於對應中的索引鍵和值絕不為 Null,Null 會做為目前缺少任何結果的可靠不可部分完成指標。 為了維護這個屬性,Null 可作為所有非純量縮減作業的隱含基礎。 針對 double、long 和 int 版本,基礎應該是結合任何其他值時傳回其他值(更正式的,應該是縮減的識別元素)。 最常見的縮減具有這些屬性;例如,使用基礎 0 計算總和,或以基礎MAX_VALUE計算最小值。
提供做為自變數的搜尋和轉換函式應該同樣會傳回 null,以指出缺少任何結果(在此情況下不會使用它)。 在對應的縮減案例中,如果不應該合併元素,這也可讓轉換做為篩選條件、傳回 Null(或在基本特製化的情況下傳回識別基礎)。 您可以在搜尋或縮減作業中使用它們之前,先自行撰寫此「Null 表示現在沒有任何」規則,以建立複合轉換和篩選。
接受和/或傳回 Entry 自變數的方法會維護索引鍵/值關聯。 例如,尋找最大值的索引鍵時,它們可能很有用。 請注意,可以使用 提供 new AbstractMap.SimpleEntry(k,v)
「plain」 Entry 自變數。
大量作業可能會突然完成,並擲回在所提供函式的應用程式中遇到的例外狀況。 請記住,處理這類例外狀況時,其他同時執行的函式也可能擲回例外狀況,或如果在未發生第一個例外狀況時這麼做。
相較於循序形式,平行處理的速度是常見的,但不保證。 如果平行處理計算的基礎工作比計算本身更昂貴,涉及小型對應上簡短函式的平行作業,執行速度可能會比循序形式慢。 同樣地,如果所有處理器都忙於執行不相關的工作,平行處理可能不會產生太多實際平行處理原則。
所有工作方法的所有自變數都必須是非 Null。
這個類別是 Java Collections Framework 的成員。
已在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 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
IsEmpty |
要新增 (繼承來源 AbstractMap) |
JniIdentityHashCode |
哈希表支援擷取的完整並行,以及更新的高預期並行存取。 (繼承來源 Object) |
JniPeerMembers |
哈希表支援擷取的完整並行,以及更新的高預期並行存取。 |
PeerReference |
哈希表支援擷取的完整並行,以及更新的高預期並行存取。 (繼承來源 Object) |
ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
方法
明確介面實作
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) |
哈希表支援擷取的完整並行,以及更新的高預期並行存取。 |