gpt4 book ai didi

java - ComputeIfAbsent 抛出并发修改异常

转载 作者:行者123 更新时间:2023-12-01 16:44:00 25 4
gpt4 key购买 nike

我有一个 Hashmap,在其中维护不同类型的读取器到它们各自的 java 类实现的映射。我有一个多线程 Java 服务器,支持 32 种类型的阅读器。

您可以假设每 30 秒,每种类型的读取器都会有 1000 个对象在内部调用 getReader()。

每当我将刷新时间减少到 20 秒时,它就会开始偶尔向某些读者抛出 ConcurrentModificationException。是预期的吗?

缩短时间有什么区别?

class Mapper {
Map<String, Reader> READER = new HashMap<>();

public static Reader getReader(type) {
Reader reader = READER.computeIfAbsent(type, k -> new ReaderImpl());
}
}

最佳答案

您应该使用 ConcurrentHashMap如果您的 map 可以被多个线程访问。

Whenever I reduce the refresh time to 20 seconds, it starts throwing ConcurrentModificationException for some readers sporadically. Is it expected?

这可能只是巧合。如果减少时间,则线程更有可能尝试访问映射并破坏它,因为您没有使用同步集合。还有一种可能性是,如果您运行应用程序足够多次,您也有可能在 30 秒的刷新时间内获得它。调试多线程应用程序很困难,因为您可能认为您的应用程序运行正常 - 但最终结果表明,十分之一的人会因为处理多线程的方式错误而收到错误。

正如 Andy Turner 正确指出的那样 - 你很幸运出现了 ConcurrentModificationException 。如果没有收到异常,并不意味着问题不存在。如果您的应用程序在生产环境中运行时收到此类错误,情况会更糟。

关于java - ComputeIfAbsent 抛出并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433061/

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