来自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块中?
答案 0 :(得分:0)
synchronizedMap
所做的是它保证在地图m
上执行的(原子)操作将被同步,例如
m.put('somekey', object);
因此,如果您运行需要更多步骤才能完成的操作,例如
应该在同步块中。
关于上面的示例,函数foo
可以删除或添加新元素到Map m
,这些元素将被同步,是的,但是同一时间的其他线程可以从地图中读取。 / p>
想象一下,没有同步:
i.hasNext()
,返回true foo
,删除了地图中的最后一个元素i.next()
< - 异常,地图为空