线程安全迭代LinkedHashMap

时间:2012-05-31 01:02:35

标签: java thread-safety

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

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

谢谢!

2 个答案:

答案 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
        }
    }
}