Ответ
ConcurrentHashMap значительно эффективнее Hashtable в многопоточных сценариях.
Сравнение механизмов синхронизации:
| Критерий | Hashtable | ConcurrentHashMap |
|---|---|---|
| Уровень блокировки | Блокирует весь объект (монитор) на время любой операции (put, get). | Использует сегментированные блокировки (до Java 8) или операции CAS на отдельных узлах (Java 8+). |
| Параллелизм | Нулевой — только один поток может работать с таблицей одновременно. | Высокий — множество потоков могут читать и модифицировать разные сегменты/узлы одновременно. |
| Производительность | Низкая из-за глобальной блокировки. | Высокая, особенно при большом количестве потоков и операций записи. |
| Null-значения | Не разрешает null ни для ключей, ни для значений. |
Также не разрешает null. |
| Статус | Устаревший (legacy) класс. | Современная, рекомендуемая реализация. |
Пример использования ConcurrentHashMap:
import java.util.concurrent.ConcurrentHashMap;
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// Потокобезопасные операции без блокировки всей таблицы
concurrentMap.put("key1", 100);
Integer value = concurrentMap.get("key1");
Вывод: Hashtable следует считать устаревшим. Для многопоточных ассоциативных массивов всегда выбирайте ConcurrentHashMap. Для однопоточного использования подойдет HashMap.