我有一个私有的LinkedHashMap,用于从不同的线程读取(仅用于读取):
class foo {
private LinkedHashMap map = ...;
public publicMethodCalledFromDifferentThreads() {
for (Object foo : map) {
...
}
}
}
此实现不是线程安全的,因此 for
循环无法正常运行。我试图自己找到解决方案,我唯一想到的是以下内容:
class foo {
private LinkedHashMap map = ...;
private Map.Entry[] mapEntries = map.entrySet().toArray() ...;
public publicMethodCalledFromDifferentThreads() {
for (int i = 0; i < mapEntries.length; i++) {
mapEntries[i]...
...
}
}
}
所以最后我需要有两个变量,迭代变得非常复杂。最好的方法是什么?
谢谢!
如果您只是在读取,并且没有修改基础对象,无论是列表还是列表中的事物,都应该没有线程问题。
您实际遇到了什么问题?
我认为您可能正在以某种方式修改您的LinkedHashMap。
此外,您如何确定线程是否在跳跃? 您确定您不只是看到 2 个线程混合的输出,即使每个线程都是按顺序迭代的,这看起来像是跳来跳去?例如,如果每个线程都打印其当前条目,您可能会看到类似
123 12 45 345 6....
这是顺序的。
您可以使用同步地图。
private final Map<K, V> map = Collections.synchronizedMap(new LinkedHashMap<K, V>());
public void foo() {
synchronized(map) {
for(K key : map.keySet()) {
// thread safe iteration
}
}
}