繁体   English   中英

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

[英]How does HashMap.computeIfAbsent fail under multithreaded use?

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

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

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

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

引用另一个答案

话虽如此,最常用的Map实现,特别是HashMap并不是线程安全的。 从不同线程添加元素可能会使地图处于不一致状态,在这种状态下,尽管size()表明存在,但无法检索已插入的元素。

换句话说:即使您今天没有问题,理论上只要切换到其他Java版本也可以使您的设计失败。

请记住:唯一的保证就是Map界面。 您正在使用一个具有一些内部结构的容器 ,该内部结构会被多个线程更新 如果这不会导致不一致,那纯属巧合

如果在多线程设置中对HashMap进行读写会“正常”,那么为什么首先需要ConcurrentHashMap?

可能发生的最坏情况是什么?

怎么样,线程A在calculateIfAbsent(k1,...)调用中,而线程B同时在get(k2)中,并且get(k2)返回错误的值?

我不知道这是否是最糟糕的事情,但这绝对是可能发生的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM