如果多个线程并发迭代一个HashMap
对象,而不修改它,是否有可能出现竞争条件?
答案 0 :(得分:5)
没有竞争,如果你可以保证在迭代时没有其他线程会修改这个HashMap。
答案 1 :(得分:3)
不,这很好。只要所有读取与所有写入同步,并且所有写入彼此同步,并发读取就没有坏处;因此,如果根本没有写入,那么所有并发访问都是安全的。
答案 2 :(得分:1)
这是对的。但是如果任何线程添加或删除一个项,这将在任何其他只是迭代HashMap的线程中抛出异常(实际上是任何集合)
答案 3 :(得分:0)
如果要重复迭代Map,可能会发现迭代数组副本的速度要快一些。
private final HashMap<String, String> properties = new HashMap<String, String>();
private volatile Map.Entry<String, String>[] propertyEntries = null;
private void updatePropertyEntries() {
propertyEntries = properties.entrySet().toArray(new Map.Entry[properties.size()]);
}
{
// no objects created
for (Map.Entry<String, String> entry : propertyEntries) {
}
}
BTW:你可以让一个线程修改/替换propertyEntries,同时在这个模式的许多线程中进行迭代。