在我的多线程代码的某处,我有一个映射(由多个线程访问)声明如下:
private Map<Foo, Integer> fooMap =
Collections.synchronizedMap(new HashMap<Foo, Integer>());
同一个类公开了一个公共方法
public Collection<Foo> getFooList() {
return fooMap.keySet();
}
在我的代码中的其他地方,我迭代了getFooList(). 我知道同步映射上的大多数操作都是线程安全的,一个值得注意的例外是迭代,它必须显式同步。我已经通过以下方式实现了这一点:
synchronized(bar.getFooList()) {
for (Foo foo : bar.getFooList()) {
// do stuff with foo
}
}
时不时地我得到一个ConcurrentModificationException声明for。我想知道我是否正在与错误的类实例同步——我应该与地图而不是它的键集同步吗?再说一次,我真的不想将整个地图公开给其他类(它是私有的,这是有原因的)。
如何以线程安全的方式迭代键集,而不必暴露整个映射?
慕桂英3389331
相关分类