来自javadoc
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 block)中?
这是否意味着每次我们需要迭代synchronizedMap时,我们都必须将迭代器包含在synchronized block 中?
最佳答案
synchronizedMap
的作用是保证在 map m
上执行的(原子)操作将被同步,例如
m.put('somekey', object);
因此,例如,如果您运行需要更多步骤才能完成的操作
- 读取一个值
- 如果!= null 删除
应该在同步块(synchronized block)中。
对于上面的例子,函数foo
可能会向Map m
删除或者添加新元素,这会被同步,是的,但是其他线程同时进行可以从 map 上读取。
想象一下没有同步:
- 线程 1 调用
i.hasNext()
返回 true - 线程 2 调用
foo
,它从映射中删除了最后一个元素 - 线程 1 调用
i.next()
<- 异常, map 为空
关于java - Collections.synchonizedMap 和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21626644/