Hashtable синхронизирует все методы на уровне метода, делая каждую операцию потокобезопасной по умолчанию. HashMap, в свою очередь, не синхронизирует никакие методы, что даёт лучшую производительность в однопоточных сценариях, но без встроенной потокобезопасности.
Синхронизация на уровне метода в Hashtable создаёт заметные накладные расходы, потому что каждая операция захватывает блокировку, даже когда никакого конкурентного доступа нет. Это делает Hashtable медленнее, чем HashMap, в большинстве сценариев.
В многопоточных приложениях избегай использовать HashMap напрямую. Вместо этого выбирай в зависимости от своих нужд:
ConcurrentHashMap для максимальной производительности со встроенной потокобезопасностьюCollections.synchronizedMap(new HashMap()) для синхронизированной обёртки, хотя это менее эффективно, чем ConcurrentHashMapConcurrentHashMap использует блокировку на уровне бакета (сегментированную блокировку) вместо блокировки на уровне объекта, позволяя нескольким потокам одновременно обращаться к разным сегментам. Это даёт лучшую конкурентность по сравнению с Hashtable, сохраняя при этом потокобезопасность.
Разница сводится к тому, когда происходит синхронизация. Hashtable синхронизирует на уровне метода ради простоты, тогда как ConcurrentHashMap использует более гранулярную стратегию блокировки для повышения производительности в многопоточных окружениях.
Hashtable синхронизирует каждый вызов метода на уровне метода, то есть все операции захватывают блокировку независимо от того, происходит ли фактический одновременный доступ.
Новый — ещё не проверен сообществом
Вы