Хеш-таблицы синхронизированы, но это старая реализация, которую можно было бы сказать, что она устарела. Кроме того, они не допускают нулевые ключи (может быть, также не нулевые значения? Не уверен).
Одна проблема заключается в том, что, хотя каждый вызов метода синхронизирован, наиболее интересные действия требуют более одного вызова, поэтому вам нужно синхронизировать несколько вызовов.
Подобный уровень синхронизации можно получить для HashMaps, вызвав:
Map m = Collections.synchronizedMap(new HashMap());
, который оборачивает карту в синхронизированные вызовы методов. Но это имеет те же недостатки параллелизма, что и Hashtable.
Как говорит Пол, ConcurrentHashMaps предоставляют потокобезопасные карты с дополнительными полезными методами для атомарных обновлений.