![](/img/trans.png)
[英]How can I perform a thread-safe get then remove with ConcurrentHashMap?
[英]Do I need ConcurrentHashMap if I only call get, put, remove with thread id being the key and never iterate the map?
原始問題在這里,但是這次情況略有不同。
我有一個靜態hashMap,與多個線程共享。 我不是在迭代地圖,也不在乎地圖的大小。 我只在地圖中使用get
, put
, remove
。 每個線程可以調用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.