2014-02-07 72 views
1

從javadocs中Collections.synchonizedMap和同步

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()); 
    } 

這裏爲什麼迭代已經封閉在同步塊?

這是否意味着每次我們需要遍歷synchronizedMap時,我們都必須將迭代器放在synchronized塊中?

回答

0

做什麼synchronizedMap是,它保證了地圖m上執行的(原子)操作將被同步,例如

m.put('somekey', object); 

因此,如果您運行需要更多的步驟來完成,例如操作

  1. 讀取值
  2. 如果!= NULL刪除

應該在同步塊中。

關於上面的例子,功能foo可能會刪除或添加新元素到Map m,這將被同步,是的,但同一時間的其他線程可能會從地圖讀取。

試想一下,沒有同步:

  1. 線程1調用i.hasNext()這回真
  2. 線程2調用foo它移除了地圖
  3. 最後一個元素線程1調用i.next() < - 例外,地圖爲空