簡體   English   中英

如果我僅以線程ID為鍵調用get,put,remove,並且從不迭代地圖,是否需要ConcurrentHashMap?

[英]Do I need ConcurrentHashMap if I only call get, put, remove with thread id being the key and never iterate the map?

原始問題在這里,但是這次情況略有不同。

我有一個靜態hashMap,與多個線程共享。 我不是在迭代地圖,也不在乎地圖的大小。 我只在地圖中使用getputremove 每個線程可以調用someClass.track(true)someClass.track(false) 我想跟蹤線程何時為每個線程進入方法(遞增#)並退出方法(遞減#)。

僅使用HashMap就足夠了嗎? 還是我必須使用ConcurrentHashMap來確保從track方法獲取正確的值?

方法看起來像這樣

private static Map<Long, Integer> TRACKER = new HashMap<Long,Integer>();
public static Integer track(boolean b) {
    long tid = Thread.currentThread().getId();
    if (b) {
        if (TRACKER.containsKey(tid)) {
            TRACKER.put(tid, TRACKER.get(tid) + 1);
        } else {
            TRACKER.put(tid, 1);
        }
    } else {
        Integer n = TRACKER.get(tid);
        if (n != null) {
            n = n -1;
            if (n == 0) {
                TRACKER.remove(tid);
            } else {
                TRACKER.put(tid, n);
            }
        }
    }
    return TRACKER.get(tid);
  }

您可以在閱讀地圖時對其進行修改。 因此,至少由於這個原因,您應該考慮使用ConcurrentHashMap或使用顯式同步機制,因為HashMap並非設計為以這種方式使用:

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

或使用ConcurrentHashMap

請注意, ConcurrentHashMap可能不合適,因為您想根據時間軸在特定時刻獲取與鍵關聯的值。 ConcurrentHashMap ,檢索操作也不會阻塞,它們反映了最后的“已知信息”, 不一定是最后的時間順序信息

檢索操作(包括get)通常不會阻塞,因此可能與更新操作(包括put和remove)重疊。 檢索反映了自發生以來最新完成的更新操作的結果。

在一般的方式,在有確切的信息I即時您的要求真的要看。 您無需解釋您的內容,但無論如何,都沒有關系,因為根據您的實際代碼,該方法由不操縱相同鍵/值的線程並發訪問。 因此,這種ConcurrentHashMap特殊性不是問題。
因此,這似乎是ConcurrentHashMap一個很好的用例。

暫無
暫無

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

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