gpt4 book ai didi

java - 当两个线程试图将相同的键值放入并发 HashMap 中时会发生什么

转载 作者:行者123 更新时间:2023-12-03 12:48:04 25 4
gpt4 key购买 nike

假设有两个线程 A、B 将分别在映射中放入两个不同的值 v1 和 v2,它们具有相同的键。 key 最初不存在于 map 中线程A调用containsKey发现key不存在,立即挂起线程 B 调用 containsKey 发现 key 不存在,有时间插入它的值 v2

当线程 A 回来时,会发生什么?我假设,它调用 put 方法,该方法又调用 putIfAbsent但是线程 B 已经插入了 key 。因此线程 A 不会覆盖该值

但是从这个链接我发现线程 A 恢复并插入 v1,“和平地”覆盖(因为 put 是线程安全的)线程 B 插入的值 Is ConcurrentHashMap totally safe?

最佳答案

以下是 ConcurrentHashMap 将为您执行的操作:

(1) 键/值对不会神秘地出现在映射中。如果您尝试获取某个键的值,您一定会获得程序中某个线程使用该键存储的值,或者如果没有线程曾为该键存储值,您将获得一个空引用。

(2) 键/值对不会从 map 上神秘消失。如果您为之前有值的某个 K 调用 get(K),并且返回空引用,那是因为程序中的某个线程存储了空值。

(3) 它不会死锁或挂起或使您的程序崩溃。

以下是 ConcurrentHashMap 不会为您做的事情:

它不会使您的程序“线程安全”。

关于线程安全,要记住的最重要的事情是:完全从“线程安全”组件构建模块或程序将不会使程序或模块成为“线程安全”。您的问题是为什么不这样做的完美示例。

ConcurrentHashMap 是一个线程安全的对象。无论有多少线程同时访问它,它都会遵守我上面列出的 promise (1)、(2) 和 (3)。但是,如果您的程序的两个线程分别尝试同时将不同的值放入同一键的映射中,那就是数据竞争。当其他线程稍后查找该键时,它获得的值将取决于哪个线程赢得了比赛。

如果您的程序的正确性取决于哪个线程赢得数据竞争,那么您的程序就不是“线程安全的”,即使构建它的对象被称为“线程安全的”。

关于java - 当两个线程试图将相同的键值放入并发 HashMap 中时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352707/

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