2014-02-07 38 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() < - 例外,地图为空