gpt4 book ai didi

尽管使用同步块(synchronized block),Java HashMap ConcurrentModification 异常

转载 作者:行者123 更新时间:2023-12-05 03:54:28 24 4
gpt4 key购买 nike

我有一个 hashmap 同时用于多个线程。为了使其线程安全,我将其放入同步块(synchronized block)中:

private final Map<Long, DeviceConnection> mapConnections = new HashMap()<>;

...

synchronized (mapConnections) {
List<Long> toClear = new ArrayList<>();
for (Map.Entry<Long, AndroidSocketConnection> entry : mapConnections.entrySet()) {
if (entry.getValue().isReadyToRemove())) {
removed++;
toClear.add(entry.getKey());
}
}
for(Long toC : toClear) {
mapConnections.remove(toC);
}
}

我想如果我把它放在同步块(synchronized block)中我就不必关心这些东西,但是抛出这个异常:

java.util.ConcurrentModificationException

at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)

at java.util.HashMap$EntryIterator.next(HashMap.java:1476)

at java.util.HashMap$EntryIterator.next(HashMap.java:1474)

at myPackage.network.DeviceHandler.doClearing(DeviceHandler.java:51) // -> this line contains the for loop head of the code I showed

at java.lang.Thread.run(Thread.java:748)

最佳答案

只有通过 synchronized block 执行对 map 的每次 访问(读取和写入),它才会是线程安全的。

ConcurrentModificationException 将在修改 map 时对其进行迭代时抛出。

我建议您切换到 ConcurrentHashMap这是线程安全的,将是一个直接的替代品。

关于尽管使用同步块(synchronized block),Java HashMap ConcurrentModification 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60957836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com