ConcurrentHashMap не распространяется на HashMap. Они оба являются реализациями hash table, но ConcurrentHashMap имеет очень разные внутренности для HashMap, чтобы обеспечить параллелизм.
Если вы предоставляете ConcurrentHashMap методу, который принимает карту, то это будет работать, и вы получите ожидаемое поведение, которое вы ожидаете. Карта - это просто интерфейс, который описывает набор методов, ConcurrentHashMap реализует этот интерфейс с одновременным поведением.
Существует различие между «параллельным» и «атомарным». Параллельно означает, что одновременно могут выполняться несколько операций, и Карта (или любая структура данных, о которой мы говорим) ВСЕГДА БУДЕТ В ДЕЙСТВИТЕЛЬНОМ СОСТОЯНИИ. Это означает, что у вас может быть несколько потоков, вызывающих put(), get(), remove() и т. Д. На этой карте, и никогда не будет никаких ошибок (если вы попробуете это с помощью обычного HashMap, вы получите ошибки, поскольку это не предназначенный для обработки параллелизма).
Атомный означает, что действие, выполняющее несколько шагов, похоже, делает один шаг к другим потокам - так же хорошо, как они знают, что оно полностью закончено или еще не началось. Для ConcurrentHashMap одним из таких примеров является putIfAbsent(). Из javadoc,
Если указанный ключ еще не связан со значением, сопоставьте его с заданным значением. Это эквивалентно:
if (!map.containsKey(key)) {
return map.put(key, value);
else
return map.get(key);
за исключением того, что действие выполняется атомарно.
Если вы попробовали вышеуказанный код с ConcurrentHashMap, вы не получили бы никаких ошибок (поскольку это Concurrent), но есть хорошие изменения, которые другие потоки будут чередовать с основным потоком, и ваша запись будет перезаписана или удален. ConcurrentMap указывает атомный метод putIfAbsent(), чтобы гарантировать, что реализации могут выполнять эти шаги атомарно, без помех от других потоков.
Что вы видите, глядя на код? Это похоже на копию или повторную реализацию? –