Да, ConcurrentHashMap может заменить Hashtable в Java, но такая миграция требует внимательного рассмотрения их фундаментальных различий в механизмах блокировки и поведении.
Hashtable использует грубую блокировку:
ConcurrentHashMap использует тонкую блокировку:
Критическое различие проявляется со составными операциями — операциями, требующими нескольких шагов:
// Работает атомарно в Hashtable
if(hashtable.get(key) == null)
hashtable.put(key, value);
Этот паттерн не потокобезопасен в ConcurrentHashMap, потому что вызовы get() и put() не являются атомарными вместе, создавая гонку между ними.
Для ConcurrentHashMap используй метод putIfAbsent():
concurrentHashMap.putIfAbsent(key, value);
Этот метод выполняет операцию проверки и вставки атомарно, обеспечивая потокобезопасность.
Заменяй Hashtable на ConcurrentHashMap ради:
Помни:
putIfAbsent(), replace() или compute()ConcurrentHashMap использует блокировку на уровне сегмента или бакета, что снижает конкуренцию по сравнению со стратегией полной блокировки карты в Hashtable.
Новый — ещё не проверен сообществом
Вы