线程安全迭代 LinkedHashMap



我有一个私有的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
        }
    }
}

最新更新