Как Hashtable в Java обеспечивает потокобезопасность?

«Как Hashtable в Java обеспечивает потокобезопасность?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Hashtable обеспечивает потокобезопасность через полную синхронизацию всех публичных методов с использованием ключевого слова synchronized.

Механизм: Каждый метод класса (такой как put, get, remove, contains) объявлен как synchronized. Это означает, что для всего объекта существует единая блокировка (монитор), и только один поток может выполнять любой из этих методов в данный момент времени.

Пример и недостатки:

Hashtable<String, Integer> table = new Hashtable<>();
// Все вызовы синхронизированы на объекте 'table'
table.put("A", 1); // Блокирует весь объект
table.get("A");    // Также блокирует весь объект

Основные проблемы этого подхода:

  1. Низкая производительность при конкуренции: Даже операции чтения (get) блокируют объект, создавая узкое место (bottleneck).
  2. Устаревший дизайн: Класс считается legacy. Для новых проектов всегда следует использовать ConcurrentHashMap.
  3. Отсутствие продвинутых атомарных операций: Нет аналогов методов compute() или merge() из ConcurrentHashMap.

Вывод: Hashtable — это пример потокобезопасности через координацию (coarse-grained locking), которая надежна, но неэффективна для высоконагруженных приложений.