3

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

所以最后我需要有两个变量,迭代变得非常复杂。最好的方法是什么?

谢谢!

4

2 回答 2

3

如果您只是阅读,并且没有修改底层对象,无论是列表还是列表中的东西,都应该没有线程问题。

您实际遇到什么问题?

我认为您可能正在以某种方式修改您的 LinkedHashMap。

此外,您如何确定线程正在跳跃?您确定您不只是看到混合的 2 个线程的输出,即使每个线程都按顺序迭代,这看起来像是在跳来跳去?例如,如果每个线程都打印其当前条目,您可能会看到类似

123 12 45 345 6....

这是顺序的....

于 2012-05-31T01:05:39.777 回答
0

您可以使用同步地图

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
        }
    }
}
于 2012-05-31T01:05:56.593 回答