如何从ConcurrentHashMap <string,set <string =“” >>中删除用作值的Set?

时间:2019-03-03 20:05:29

标签: java concurrency race-condition java.util.concurrent concurrenthashmap

让我们考虑以下代码:

ConcurrentHashMap<String, Set<String>> map = new ConcurrentHashMap<>();

// Add element: {mapKey, setValue}

map.computeIfAbsent(mapKey, new Function<String, Set<String>>() {
    @Override
    public Set<String> apply(String mapK) {
        return ConcurrentHashMap.newKeySet();
    }
}).add(setValue);

// Remove element: {mapKey, setValue}

Set<String> updatedSet = map.computeIfPresent(mapKey, new BiFunction<String, Set<String>, Set<String>>() {
    @Override
    public Set<String> apply(String mapK, Set<String> old) {
        old.remove(setValue);
        return old;
    }
});

// I need remove mapKey, but I cannod do this like this, because of race condition bug
if (updatedSet.isEmpty()) {
    map.remove(mapKey);
}

所以,我们看到的是

  1. 我们有ConcurrentHashMap<String, Set<String>>张地图,其中key张地图是String,而valueConcurrentHashSet
  2. setmap时,我需要删除set,它是empty的值。
  3. 由于种族条件错误,我无法实施set的幼稚删除。

我的问题有什么绝妙的解决方法吗?

1 个答案:

答案 0 :(得分:2)

select * from TRN_SUMMARY where :P2_DATE IS NULL OR REP_DATE = :P2_DATE; 如果映射器返回computeIfPresent,则删除该条目。如果要删除条目,请从映射器返回null,而不是在单独的步骤中执行删除操作。

(此外,您实际上应该将null折叠到.add(setValue)映射器中,并使用computeIfAbsent而不是compute,因为您没有采取任何措施来保护立即computeIfAbsent致电。也可以选择使用add。)