gpt4 book ai didi

java - 我想将 computeIfPresent 和 putIfAbsent 都放到一个原子函数中

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:27 25 4
gpt4 key购买 nike

workObjectMap.computeIfPresent(key, (k,v) -> {
v.memberIdSet.addAll(memberIdSet);
v.memberPositionSet.addAll(memberPositionSet);
return v;
});
// If it.remove() in run() is called at this point,
// there is a risk of the same work being done twice
workObjectMap.putIfAbsent(key, new WorkObjectValue(memberIdSet, memberPositionSet));

我有上面的代码。在一个单独的线程中,我可能会从 workObjectMap 中删除。我想要一个原子函数,如果键存在则修改值,如果不存在,它会放置键/值。

在我当前的代码中,删除有可能发生在 computeIfPresentputIfAbsent 之间,以便已经添加到 map 中的相同项目,将再次添加。

如何阻止这两个方法调用之间的任何删除? (computeIfPresentputIfAbsent)

最佳答案

使用Map.compute() :

workObjectMap.compute(key, (k,v) -> {
if (v == null) return new WorkObjectValue(memberIdSet, memberPositionSet);
v.memberIdSet.addAll(memberIdSet);
v.memberPositionSet.addAll(memberPositionSet);
return v;
});

请注意 the ConcurrentHashMap Javadoc explicitly states这是原子的。

关于java - 我想将 computeIfPresent 和 putIfAbsent 都放到一个原子函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087162/

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