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