gpt4 book ai didi

java - Concurrent HashMap merge() 和 put() 的区别

转载 作者:行者123 更新时间:2023-12-01 23:44:06 27 4
gpt4 key购买 nike

我最近偶然发现一篇文章,其中阐述了合并方法在 ConcurrentHashMap 中执行原子操作的重要性。以下是文章链接:

https://www.nurkiewicz.com/2019/03/mapmerge-one-method-to-rule-them-all.html

它表示合并方法要么将新值置于给定键下(如果不存在),要么使用给定值 (UPSERT) 更新现有键并解释此概念。然而,这正是 put() 方法所做的。

ConcurrentHashMap 中的 get() 和 put() 不是线程安全的。

请指导我理解 merge() 如何处理 get() 和 put() 在一起的场景并使 ConcurrentHashMap 上的操作线程安全?

最佳答案

并发代码的一个关键概念是,两个原子操作一个接一个地执行不一定与单个原子操作执行相同的操作具有相同的效果。

让我们忽略映射尚未包含值的情况,因为这是不太有趣的情况(您仍然需要处理竞争条件,但另一个更有趣)。

因此,如果给定键已经有一个值,那么 merge 基本上变成了 put(key, mergeFunction(newValue, get(key))

如果您以这种方式实现它,那么您可能会遇到丢失更新的非常现实的问题:

  1. 您的线程执行 get(key) 并获取当前值(我们称之为 v1)
  2. 另一个 线程将键的绑定(bind)更新为新值(我们称之为 v2)
  3. 您的线程使用 v1 和您要合并的参数(我们称之为 v3)计算新的更新值
  4. 您的线程将键的绑定(bind)更新为新合并的值 v3

请注意,对 v2 的更新基本上会被您的代码忽略(覆盖)。如果映射值旨在表示计数器,则意味着您基本上完全忽略了一次更新,并且会得到错误的结果。

merge 提供了一种将更新应用到现有值的方法,而不必担心其他并发更新会改变您的值而您会丢失更新。

关于java - Concurrent HashMap merge() 和 put() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64532985/

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