Нет, это не потокобезопасно для любых операций.Вам нужно синхронизировать весь доступ или использовать что-то вроде ConcurrentHashMap
.
Моя любимая ужасная история устранения неполадок в производственной системе - это когда мы обнаружили, что HashMap.get
зашел в бесконечный цикл, блокируя 100% ЦП навсегда из-за отсутствия синхронизации,Это произошло потому, что связанные списки, которые использовались в каждом сегменте, попали в противоречивое состояние.То же самое может произойти с containsKey
.
. Вы должны быть в безопасности, если никто не изменяет HashMap после его первоначальной публикации, но лучше использовать реализацию, которая гарантирует это явно (например,ImmutableMap или, опять же, ConcurrentMap).