Еще одно отличие, которое я могу найти при реализации обоих классов, заключается в следующем:
• Класс Hashtable
синхронизирует все свои методы, т. Е. Блокировка выполняется на уровне метода, и, следовательно, можно сказать, что мьютекс всегда в объекте Hashtable
(this
) уровень.
• Метод Collections.synchronizedMap(Map)
возвращает экземпляр SynchronizedMap
, который является внутренним классом для класса Collections
. Этот класс имеет все свои методы в блоке Synchronized
с мьютексом. Разница здесь в мьютексе. Внутренний класс SynchronizedMap
имеет два конструктора, один из которых принимает в качестве аргумента только Map
, а другой - в качестве аргумента Map
и Object
(мьютекс). По умолчанию, если используется первый конструктор с передачей только Map
, this
используется в качестве мьютекса. Однако разработчику разрешено передавать другой объект мьютекса в качестве второго аргумента, с помощью которого блокировка методов Map
будет только для этого Object
и, следовательно, менее ограничительной, чем Hashtable
.
• Следовательно, Hashtable
использует синхронизацию на уровне метода, но Collections.synchronizedMap(Map)
предоставляет гибкость для блокировки разработчика на предоставленном мьютексе с блоком Synchronized
.