我有一个私有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]...
...
}
}
}
所以最后我需要有两个变量,迭代变得非常复杂。最好的方法是什么?
谢谢!
答案 0 :(得分:3)
如果您只是阅读,并且未修改基础对象,列表和列表中的内容都应该没有线程问题。
您实际遇到了什么问题?
我认为您可能会以某种方式修改LinkedHashMap。
更重要的是,你是如何确定线程的跳跃?你确定你不只是看到混合的2个线程的输出,即使每个线程按顺序迭代,它们看起来像是跳来跳去吗?例如,如果每个线程打印其当前条目,您可能会看到类似
的内容123 12 45 345 6 ....
这是顺序....
答案 1 :(得分:0)
您可以使用synchronized map。
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
}
}
}