亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果我只以線程 id 為鍵調用 get、put、remove 并且從不迭代映射

如果我只以線程 id 為鍵調用 get、put、remove 并且從不迭代映射

慕田峪7331174 2021-09-03 21:30:43
我有一個靜態 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);  }
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

您可以在閱讀時修改地圖。因此,至少出于這個原因,您應該考慮使用ConcurrentHashMap或使用顯式同步機制,因為HashMap它并非旨在以這種方式使用:

請注意,此實現不是同步的。如果多個線程并發訪問一個散列映射,并且至少有一個線程在結構上修改了映射,則必須在外部進行同步。

或使用ConcurrentHashMap.

請注意,這ConcurrentHashMap可能不適合,因為您希望根據時間線在特定時刻獲取與鍵關聯的值。與 一樣ConcurrentHashMap,檢索操作不是阻塞的,它們反映了最后一個“已知信息”,不一定是最后一個按時間順序排列的信息:

檢索操作(包括獲?。┮话悴粫枞虼丝赡芘c更新操作(包括放置和刪除)重疊。檢索反映了最近完成的更新操作的結果。

一般來說,I即時獲得確切信息實際上取決于您的要求。你不解釋你的,但無論如何,這并不重要,因為根據你的實際代碼,該方法由不操作相同鍵/值的線程并發訪問。所以,這種ConcurrentHashMap特殊性不是問題。
所以對于ConcurrentHashMap.


查看完整回答
反對 回復 2021-09-03
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號