Collections.synchonizedMap和同步

时间:2014-02-07 11:31:21

标签: java collections

来自javadocs

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

这里为什么迭代器已被包含在synchronized块中?

这是否意味着每次我们需要迭代synchronizedMap时我们必须将迭代器包含在synchronized块中?

1 个答案:

答案 0 :(得分:0)

synchronizedMap所做的是它保证在地图m上执行的(原子)操作将被同步,例如

m.put('somekey', object);

因此,如果您运行需要更多步骤才能完成的操作,例如

  1. 读取值
  2. if!= null delete
  3. 应该在同步块中。

    关于上面的示例,函数foo可以删除或添加新元素到Map m,这些元素将被同步,是的,但是同一时间的其他线程可以从地图中读取。 / p>

    想象一下,没有同步:

    1. 主题1调用i.hasNext(),返回true
    2. 线程2调用foo,删除了地图中的最后一个元素
    3. 主题1调用i.next()< - 异常,地图为空