Поскольку ConcurrentHashMap (например) предназначен для использования из параллельного контекста, вам не нужно синхронизировать его дальше. Фактически, это может подорвать оптимизацию, которую он вносит.
Например, Collections.synchronizedMap (...) представляет собой способ сделать поток карты безопасным, насколько я понимаю, он работает по сути, заключая все вызовы в ключевое слово synchronized. Что-то вроде ConcurrentHashMap, с другой стороны, создает синхронизированные «сегменты» между элементами в коллекции, вызывая более тонкий контроль параллелизма и, следовательно, снижая конкуренцию за блокировку при интенсивном использовании. Это может также не заблокировать чтение, например. Если вы снова обернетесь этим с каким-то синхронизированным доступом, вы можете это подорвать. Очевидно, вы должны быть осторожны, чтобы синхронизировать весь доступ к коллекции и т. Д., Что является еще одним преимуществом более новой библиотеки; вам не нужно беспокоиться (как много!).
Коллекции java.lang.concurrent могут реализовать безопасность своих потоков с помощью syncrhonised. в этом случае спецификация языка гарантирует видимость. Они могут реализовать вещи без использования замков. Я не настолько ясен в этом, но я предполагаю, что такая же видимость была бы здесь.
Если вы видите, как выглядит потерянное обновление в вашем коде, возможно, это просто состояние гонки. Что-то вроде ConcurrentHashpMap даст вам самое последнее значение для чтения, и запись, возможно, еще не была записана. Часто это компромисс между точностью и производительностью.
Дело в том; java.util.concurrent материал предназначен для этой цели, поэтому я уверен, что он обеспечивает видимость и использование энергозависимой и / или дополнительной синхронизации не требуется.