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

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

對(duì)同步映射的鍵集進(jìn)行線程安全迭代

對(duì)同步映射的鍵集進(jìn)行線程安全迭代

天涯盡頭無女友 2022-06-23 16:29:24
在我的多線程代碼的某處,我有一個(gè)映射(由多個(gè)線程訪問)聲明如下:private Map<Foo, Integer> fooMap =    Collections.synchronizedMap(new HashMap<Foo, Integer>());同一個(gè)類公開了一個(gè)公共方法public Collection<Foo> getFooList() {    return fooMap.keySet();}在我的代碼中的其他地方,我迭代了getFooList(). 我知道同步映射上的大多數(shù)操作都是線程安全的,一個(gè)值得注意的例外是迭代,它必須顯式同步。我已經(jīng)通過以下方式實(shí)現(xiàn)了這一點(diǎn):synchronized(bar.getFooList()) {    for (Foo foo : bar.getFooList()) {        // do stuff with foo    }}時(shí)不時(shí)地我得到一個(gè)ConcurrentModificationException聲明for。我想知道我是否正在與錯(cuò)誤的類實(shí)例同步——我應(yīng)該與地圖而不是它的鍵集同步嗎?再說一次,我真的不想將整個(gè)地圖公開給其他類(它是私有的,這是有原因的)。如何以線程安全的方式迭代鍵集,而不必暴露整個(gè)映射?
查看完整描述

1 回答

?
慕桂英3389331

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

來自Javadoc:


當(dāng)?shù)淙魏渭弦晥D時(shí),用戶必須在返回的地圖上手動(dòng)同步:


  Map m = Collections.synchronizedMap(new HashMap());

      ...

  Set s = m.keySet();  // Needn't be in synchronized block

      ...

  synchronized (m) {  // Synchronizing on m, not s!

      Iterator i = s.iterator(); // Must be in synchronized block

      while (i.hasNext())

          foo(i.next());

  }

不遵循此建議可能會(huì)導(dǎo)致不確定的行為。如果指定的映射是可序列化的,則返回的映射將是可序列化的。


您可以使用ConcurrentHashMapwhich 保證并發(fā)keySet。見這里:


視圖的迭代器是一個(gè)“弱一致”的迭代器,它永遠(yuǎn)不會(huì)拋出 ConcurrentModificationException,并保證在構(gòu)造迭代器時(shí)遍歷元素,并且可以(但不保證)反映構(gòu)造后的任何修改。


查看完整回答
反對(duì) 回復(fù) 2022-06-23
  • 1 回答
  • 0 關(guān)注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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