编程语言
首页 > 编程语言> > java-通过LinkedHashMap进行线程安全迭代

java-通过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 ….

这是顺序的…

标签:thread-safety,java
来源: https://codeday.me/bug/20191201/2079513.html