我想将computeIfPresent和putIfAbsent都集成到一个原子函数中

时间:2018-06-28 15:58:35

标签: java concurrency java-8 concurrenthashmap atomicity


    function myFunction() {
        $("bloader").fadeOut(2000);
        myVar = setTimeout(showPage, 2000);
    }

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

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

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

1 个答案:

答案 0 :(得分:4)

使用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是原子的。