第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java 并發(fā):當(dāng)并發(fā)線程僅刪除元素時(shí),HashMap 與 ConcurrentHashMap

Java 并發(fā):當(dāng)并發(fā)線程僅刪除元素時(shí),HashMap 與 ConcurrentHashMap

叮當(dāng)貓咪 2023-08-23 11:38:07
我有一個(gè)主線程,它創(chuàng)建一個(gè) HashMap,向其中添加多個(gè)可運(yùn)行對象,然后啟動(dòng)每個(gè)可運(yùn)行對象(將 HashMap 傳遞給每個(gè)對象)。可運(yùn)行對象在即將完成處理之前從映射中刪除其對象。我想知道在這種情況下是否有任何理由使用 ConcurrentHashMap (而不是 HashMap) - 可運(yùn)行對象在地圖上執(zhí)行的唯一操作就是將自己從中刪除。在這種情況下是否需要考慮并發(fā)性而需要使用 ConcurrentHashMap?主線程private final Map<Integer, Consumer> runnableMap = new HashMap<>();Runnable runnable;for (int i = 1; i <= NUM_RUNNABLES; i++) {    runnable = new Consumer(i, runnableMap);    runnableMap.put(i, runnable);    executionContext.execute(runnable);}消費(fèi)者實(shí)現(xiàn)Runnableprivate final Integer consumerNumber;private final Map<Integer, Consumer> runnableMap;public Consumer(int consumerNumber, final Map<Integer, Consumer> runnableMap){    this.consumerNumber = consumerNumber;    this.runnableMap = runnableMap;}public void run() {    :::    // business logic    :::    // Below remove is the only operation this thread executes on the map    runnableMap.remove(consumerNumber);}
查看完整描述

3 回答

?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您這樣做的原因是跟蹤線程完成情況,為什么不使用 CountdownLatch?不確定 HashMap 是否只能在刪除時(shí)出現(xiàn)并發(fā)問題,我建議僅當(dāng)您的代碼不會(huì)因任何可能的問題而中斷時(shí)才使用它,或者使用 ConcurrentHashMap。



查看完整回答
反對 回復(fù) 2023-08-23
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

javadoc說HashMap


請注意,此實(shí)現(xiàn)不是同步的。

如果多個(gè)線程同時(shí)訪問哈希圖,并且至少有一個(gè)線程在結(jié)構(gòu)上修改了該圖,則必須進(jìn)行外部同步。(結(jié)構(gòu)修改是添加或刪除一個(gè)或多個(gè)映射的任何操作;僅更改與實(shí)例已包含的鍵關(guān)聯(lián)的值不是結(jié)構(gòu)修改。)這通常是通過在自然封裝映射的某個(gè)對象上進(jìn)行同步來完成的。

上面提到,刪除是一個(gè)結(jié)構(gòu)性的改變,必須使用同步。

再者,在removeNode()Hashmap的方法中(方法調(diào)用的remove()),modCount變量是遞增的,它負(fù)責(zé)ConcurrentModificationException.?因此,如果在沒有同步的情況下刪除元素,您可能會(huì)遇到此異常。

因此您必須使用ConcurrentHashMap.


查看完整回答
反對 回復(fù) 2023-08-23
?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

您詢問了HashMap和之間的差異ConcurrentHashMap,但還需要考慮一個(gè)額外的數(shù)據(jù)結(jié)構(gòu):Hashtable。每一個(gè)都存在差異和權(quán)衡。您需要評估哪一個(gè)最適合您的預(yù)期用途。

  • HashMap是不同步的,因此如果多個(gè)線程可以讀取或?qū)懭胨?,您的結(jié)果將是不可預(yù)測的。HashMap還允許 null 作為鍵或值。

  • Hashtable是同步的,不支持空鍵或值。來自哈希表 Javadoc:

    哈希表是同步的。如果不需要線程安全的實(shí)現(xiàn),建議使用HashMap代替Hashtable。如果需要線程安全的高并發(fā)實(shí)現(xiàn),那么建議使用ConcurrentHashMap代替Hashtable。

  • ConcurrentHashMap是線程安全的,不允許使用 null 作為鍵或值。


查看完整回答
反對 回復(fù) 2023-08-23
  • 3 回答
  • 0 關(guān)注
  • 326 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號