当前位置: 首页 > 面试题库 >

组合putIfAbsent并替换为ConcurrentMap

姜志
2023-03-14
问题内容

我有一个用例,我必须

  • 如果键在ConcurrentHashMap中不存在,则插入一个新值
  • 如果键已经存在于ConcurrentHashMap中,则新值将旧值替换为新值(其中新值是从旧值派生的(不是昂贵的操作))

我提供以下代码:

public void insertOrReplace(String key, String value) {
        boolean updated = false;
        do {
            String oldValue = concurrentMap.get(key);
            if (oldValue == null) {
                oldValue = concurrentMap.putIfAbsent(key, value);
                if (oldValue == null) {
                    updated = true;
                }
            }
            if (oldValue != null) {
                final String newValue = recalculateNewValue(oldValue, value);
                updated = concurrentMap.replace(key, oldValue, newValue);
            }
        } while (!updated);
    }

您认为它是正确的并且是线程安全的吗?

有没有更简单的方法?


问题答案:

您可以使用下面与您的代码等效的代码来使其短一些。我已经对数以千计的线程进行并发访问进行了一些压力测试:它按预期运行,并执行了许多重试(循环)(显然,您无法在并发世界中通过测试来证明其正确性)。

public void insertOrReplace(String key, String value) {
    for (;;) {
        String oldValue = concurrentMap.putIfAbsent(key, value);
        if (oldValue == null)
            return;

        final String newValue = recalculateNewValue(oldValue, value);
        if (concurrentMap.replace(key, oldValue, newValue))
            return;
    }
}


 类似资料:
  • 我正在使用一个使用自己的Android:Theme的库,因此在构建时收到以下错误:错误:(55,9)任务':Contacit:ProcessDebugManifest'的执行失败。 清单合并失败:com.github.florent37:MaterialViewPager:1.0.3.2:11:18value=(@style/AppTheme)中也存在来自AndroidManifest.xml:4

  • 虽然合并(merge)操作可以用来简单和方便地整合改动,但是它却不是唯一的方法。“Rebase” 就是另一种替代手段。 注释 虽然 rebase 相对于我们已知的整合操作来说有着比较显著的优点,但是这也是在很大程度上取决于个人的喜好。一些团队喜欢使用 rebase,而另一些可能倾向于使用合并。 Rebase 相对于合并来说是比较复杂的。我建议你可以跳过这一章,除非你和你的团队确定会用到 rebas

  • 问题内容: 我从一维数组生成有效的成对组合之后。如果n> 1000,Itertools效率太低 最近的事情在这里。 问题答案: 一种方法是获取内存,从而提高性能- 另一个基于NumPy的控件将用于获取网格视图,然后进行遮罩- 二。三联体组合 我们将扩展相同的方法,以使自己成为三元组合- 高阶组合将同样扩展。 样品运行- 时间(包括Python的内置- )-

  • 我有些状态 当我尝试更新嵌套属性,如时,我调用如下所示 然而,这只是将状态替换为 我就失去了其他财产

  • 问题内容: 我正在寻找一个jQuery方法来合并两个数组,以便它们的值交替出现: 我想要的结果是: 请注意,我知道在JS中做到这一点并不重要,但是我追求的是jQuery方法。 问题答案: 您可以使用以下方法:

  • 我试图找到一个单词中所有元音的所有可能组合。例如给定“你好”: 我编写了以下函数,它只接受每个元音,在每个元音处,它只会将其全部替换为元音并将每个版本添加到列表中。我正在尝试根据需要将其更改为排列,但它不起作用。我尝试在附加后插入元音(“”.join(string),arr),但这会导致无限递归。 有人有什么建议吗?