我想将computeIfPresent和putIfAbsent都放入一个原子函数中

Cam*_*lla 6 java concurrency atomic concurrenthashmap java-8

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));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Did*_*r L 6

使用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;
});
Run Code Online (Sandbox Code Playgroud)

请注意,JavadocConcurrentHashMap明确指出这是原子的。