簡體   English   中英

如果線程不更改 map 的結構,我應該使用 ConcurrentHashMap 還是 HashMap?

[英]Should I use ConcurrentHashMap or HashMap if I threads don't change structure of map?

對於這種情況,我是否需要 Java 中的 ConcurrentHashMap:

之前,將 HashMap 傳遞給一堆線程,我使用所有必要的密鑰啟動 map:

Key = "thread1Key", Value = null
Key = "thread2Key", Value = null
Key = "thread3Key", Value = null
...

每個任務都是 Runnable(由線程執行)的一部分,並被分配以更改這些鍵中只有 1 個的值。 它是預先分配的。 換句話說,我不需要擔心多個 Runnable 可能會更改 hashmap 中的相同密鑰的情況。

在這種情況下,需要 ConcurrentHashMap 還是常規的 HashMap 可以? 為什么?

謝謝!

HashMap的這種用法在沒有額外同步的情況下是安全的。 文檔准確描述了您的用例:

如果多個線程同時訪問一個hash map,並且至少有一個線程在結構上修改了map,則必須進行外部同步。 (結構修改是添加或刪除一個或多個映射的任何操作;僅更改與實例已包含的鍵關聯的值不是結構修改。)

在這種情況下, HashMap可能在結構上保持一致,但也存在其值可見性的問題。 如果在一個線程中更改了一個值,則不能保證其他線程可以看到它。 或者,如果是,那么它也可能不一致,因為它沒有在線程之間安全地發布。

對於這種情況,我是否需要 Java 中的 ConcurrentHashMap:

之前,將 HashMap 傳遞給一堆線程,我使用所有必要的鍵啟動 map:

Key = "thread1Key", Value = null
Key = "thread2Key", Value = null
Key = "thread3Key", Value = null
...

每個任務都是 Runnable 的一部分(由線程執行),並被分配以更改這些鍵中只有 1 個的值。 它是預先分配的。 換句話說,我不需要擔心多個 Runnable 可能會更改 hashmap 中的相同鍵的情況。

在這種情況下需要 ConcurrentHashMap 還是常規的 HashMap 會做? 為什么?

謝謝!

如果沒有刪除 map 中的條目,則常規 map 就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM