Вопрос:

Вложенный Java ConcurrentHashMap это потокобезопасное?

java multithreading hashmap thread-safety

496 просмотра

1 ответ

5 Репутация автора

Так что это реализация ..

public ConcurrentMap<String , ConcurrentMap<String, Object>> map = new ConcurrentHashMap<>();

public void put(String subKey, String key, Object value) {
    map.putIfAbsent(subKey, new ConcurrentHashMap<>());
    map.get(subKey).put(key, value);
}

public Object get(String subKey, String key) {
    return map.get(subKey) == null ? null : map.get(subKey).get(key);
}

Путь выглядит поточно-ориентированным

  • PutIfAbsent - это атомарная операция.
  • Тогда получите внутреннюю карту, и значение будет также поточно-ориентированным, как я думаю.

Спасибо за любые разъяснения

Автор: Ivan Источник Размещён: 28.12.2017 08:21

Ответы (1)


0 плюса

85156 Репутация автора

Решение

В putметоде вы всегда создаете новый ConcurrentHashMap, даже если он не нужен. Это расточительно.

Кроме того , в putметоде, если ключ карты могут быть удалены с помощью другого потока, вложенная карта может быть удален между putIfAbsentи getвызовами, вызывая NullPointerException. Используйте computeIfAbsentвместо:

public void put(String subKey, String key, Object value) {
    map.computeIfAbsent(subKey, k -> new ConcurrentHashMap<>())
       .put(key, value);
}

В этом getметоде не следует вызывать getдважды, поскольку значение может измениться между первым и вторым вызовом. Сохраните значение в переменной:

public Object get(String subKey, String key) {
    ConcurrentMap<String, Object> subMap = map.get(subKey);
    return subMap == null ? null : subMap.get(key);
}
Автор: Andreas Размещён: 28.12.2017 08:27
Вопросы из категории :
32x32