Правильное использование cache.putIfAbsent() в Cache2k

Мне интересно, как работать с методом putIfAbsent() при использовании кэша Cache2k. Например, в ConcurrentHashMap каждый работает с таким методом:

Set<X> set = map.get(name);
if (set == null) {
    final Set<X> value = new HashSet<X>();
    set = map.putIfAbsent(name, value);
    if (set == null) {
        set = value;
    }
}

(Скопировано из Если вы проверяете, содержит ли карта ключ, прежде чем использовать putIfAbsent ConcurrentMap)

Версия Cache2K возвращает логическое значение. Что это значит и что это говорит мне, когда более 1 потока вставляет значение, используя один и тот же ключ.

Любая помощь будет принята с благодарностью, так как я немного не уверен, как с этим справиться. Я использую последнюю версию 0.26-бета.

Спасибо и всего наилучшего, Майкл

1 ответ

Решение

putIfAbsent() эквивалентно:

if (!cache.containsKey(key)) {
  cache.put(key, value);
  return true;
} else {
  return false;
}

кроме того, что это выполнено атомарно.

Метод возвращает значение true, если значение было вставлено (это означает, что оно не существовало ранее). Поскольку он выполняется атомарно, только поток, значение которого было успешно вставлено, получает истинное значение.

Ум, который положил, может вызвать писателя, если он зарегистрирован. Writer не вызывается, если значение уже присутствует.

Семантика этого метода идентична JCache/JSR107. Такое поведение может не иметь смысла для всех ситуаций или является интуитивно понятным. Смотрите обсуждение в https://github.com/jsr107/jsr107spec/issues/303.

Если хотите, попробуйте в другом вопросе объяснить ваш вариант использования или желаемую семантику кэша, чтобы мы могли обсудить, каким может быть наилучший подход.

Другие вопросы по тегам