Это не бесполезно. Представьте себе случай, когда ничего не нужно делать с результатом get
. В этом случае и containsKey
, и get
имеют (и страдают) одинаковые проблемы.
Как указывает Voo в комментарии, код часто может быть записан в виде putIfAbsent
(который предназначен для представления атомарной операции большего размера).
Это просто не (как он не может сам по себе) не создает больший атомный контекст . То есть ничто не позволяет другим потокам делать что-либо с concurrentHashMap
между containsKey
и get
. Обратите особое внимание на контракт от Javadoc :
... даже если все [отдельные] являются поточно-ориентированными, операции поиска не влекут за собой блокировку, а не поддерживает блокировку всей таблицы таким образом, чтобы это весь доступ ...
Операции получения (включая get) обычно не блокируются, поэтому могут перекрываться с операциями обновления (включая put и remove). Извлечение [например, containsKey или get] отражают результаты самых последних завершенных операций обновления , удерживающих их начало ...
Существует разница между «поточно-ориентированным» объектом и правильным использованием указанного объекта в параллельном контексте.
Удачного кодирования.