Давайте рассмотрим следующий код:
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);
}
Итак, что мы можем увидеть:
- У нас есть
ConcurrentHashMap<String, Set<String>>
карта, где key
карта String
, а value
- это ConcurrentHashSet
. - Мне нужно удалить
set
, значение map
, когда set
равно empty
. - Iне могу реализовать наивное удаление
set
из-за ошибки состояния гонки.
Есть ли какое-нибудь блестящее решение моей проблемы?