簡體   English   中英

ConcurrentHashMap線程中的Treemap安全嗎?

[英]is Treemap inside ConcurrentHashMap thread safe?

我有如下情況的嵌套地圖:

private final static Map<String, TreeMap<Long,String>> outerConcurrentMap = new ConcurrentHashMap<>();

我知道ConcurrentHashMap是線程安全的,但是我想了解TreeMap的此CHM所持有的內容,它們在CHM中也是線程安全的嗎?

我正在執行的操作是:

  1. 如果找不到特定的密鑰->創建新的TreeMap並放置密鑰。
  2. 如果找到了密鑰,則獲取TreeMap,並對其進行更新。
  3. 使用get(K)從CHM檢索TreeMap。
  4. 使用tailMap(K,boolean)方法從TreeMap中檢索數據。
  5. clear() CHM。

在這種情況下,我想要一個線程安全的結構。 上面的實現是否是線程安全的? 如果沒有,請提出解決方案。

一旦完成TreeMap<?, ?> tm = chm.get(key); 您不再處於線程安全區域。 特別是,如果另一個線程(通過或不通過CHM)更新樹圖,您可能會看到更改,也可能不會看到更改。 更糟糕的是,您在tm擁有的地圖副本可能已損壞...

一種選擇是使用線程安全映射,例如ConcurrentSkipListMap。

簡單的回答:不。

如果您的映射是ConcurrentHashMap,則所有影響哈希映射狀態的操作都是線程安全的。 這完全意味着存儲在該映射中的對象成為線程安全的。

那將如何工作; 您創建了任何類型的對象,並將其添加到此類映射中,則對象本身變為線程安全的? 當您從地圖上刪除該對象時,是否恢復了“線程不安全”?

假設您要在多個線程中進行所有操作,不,這不是線程安全的。

忽略您已經通過ConcurrentHashMap 訪問 TreeMap的事實-您最終有多個線程同時訪問TreeMap ,包括其中一個或多個寫入地圖的線程。 這是不安全的,因為TreeMap在這種情況下不是線程安全的:

請注意,此實現未同步。 如果多個線程同時訪問一個映射,並且至少有一個線程在結構上修改該映射,則必須在外部進行同步。

您的某些方案是線程安全的,有些則不是:

1.是的,這是線程安全的,盡管其他線程在將其放入CHM之前無法看到新創建的TreeMap。 但這應謹慎執行,以避免出現競爭情況-您應確保自動執行檢查和插入:

// create an empty treemap somewhere before
TreeMap<Long, String> emptyMap = new TreeMap<>();
...
// On access, use putIfAbsent method to make sure that if 2 threads  
// try to get same key without associated value sumultaneously,
// the same empty map is returned  
if (outerConcurrentMap.putIfAbsent(key, emptyMap) == null) {
    emptyMap = new TreeMap<>();
};
map = outerConcurrentMap.get(key);

2,3,4,不,你首先需要明確的鎖或使用鎖定此TreeMap的synchronized TreeMap本身不同步。

5.是的,這是在CHM上執行的操作,因此是線程安全的。

如果需要完全線程安全的排序映射,請改用ConcurrentSkipListMap 它比TreeMap慢,但是它的內部結構不需要在訪問期間鎖定完整集合,從而使其在並發環境中有效。

TreeMap本身不應該是線程安全的。 因為僅影響ConcurrentHashMap的方法。

您可以執行以下操作:

private final static Map<String, SortedMap <Long,String>> outerConcurrentMap= new ConcurrentHashMap<String, SortedMap <Long,String> >();

static {
    // Just an example
    SortedMap map = Collections.synchronizedSortedMap(new TreeMap(...));
    outerConcurrentMap.put("...",map);
}

暫無
暫無

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

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