java 迭代 线程_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值