gpt4 book ai didi

java - HashMap.computeIfAbsent 在多线程使用下如何失败?

转载 作者:行者123 更新时间:2023-11-30 06:41:51 25 4
gpt4 key购买 nike

java.util.HashMap 的文档明确指出:“如果多个线程同时访问一个 HashMap ,并且至少有一个线程在结构上修改了该映射,则它必须在外部进行同步。”

但是,请考虑使用映射作为缓存以减少不可变对象(immutable对象)创建的用例,其中仅在 HashMap 上调用 computeIfAbsent(不删除/逐出)。您唯一关心的是 computeIfAbsent 返回一个有效对象;您不关心 computeIfAbsent 是否偶尔会产生额外的对象或覆盖现有条目。

最坏的情况是什么?在我的随意测试中,没有负面影响。 (我会使用 ConcurrentHashMap,但在这个用例中它相对较慢。)

最佳答案

这里的问题:如果有的话,线程安全将是一个实现细节。它可能恰好适用于一个 JVM 版本,但略有不同,或在某些其他版本的 java.util.HashMap 中为“关闭”。

引用另一个 answer :

That being said, the most commonly used Map implementations, specifically HashMap are not thread safe. Adding elements from different threads can leave the map in an inconsistent state where e.g. elements that have been inserted cannot be retrieved though size() shows that they're present.

换句话说:即使您今天没有问题,只是切换到不同的 Java 版本理论上也可能导致您的设计失败。

请记住:您拥有的唯一保证是 Map 接口(interface)。您正在使用一个容器,它有一些内部结构,可以通过多个线程更新。如果发生这种情况不会导致不一致,那纯属巧合

如果读写 HashMap 在多线程设置中“正常工作”,为什么首先需要 ConcurrentHashMap?!

关于java - HashMap.computeIfAbsent 在多线程使用下如何失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540967/

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