Интервьюер спросил меня о недостатках использования потокового класса, такого как Hashtable, в однопоточной среде?
Да, хотя большинство недостатков связано с производительностью. Даже в однопоточных средах есть несколько потоков (например, GC, финализаторы, обработчики сигналов, JMX и т. Д.), Поэтому языку по-прежнему необходимо подчиняться конструкциям синхронизации, таким как synchronized
, volatile
, и реализациям собственной блокировки. Эти языковые функции очищают или делают недействительными кэши памяти и влияют на переупорядочение кода, что может существенно повлиять на общую производительность во время выполнения.
если нет, то почему появился класс, не поддерживающий потоки?
Не поточно-ориентированные объекты всегда работают лучше, чем их поточно-ориентированные аналоги в однопоточных или многопоточных приложениях. Способность работать с локальной кэш-памятью ЦП является одним из основных увеличений скорости, обеспечиваемых современным оборудованием. Если вам не нужно обращаться к шине основной памяти, вы можете выполнять операции на несколько порядков быстрее. Конструкции синхронизации уменьшают возможность использования кэш-памяти.
Наконец, поточно-ориентированные классы, как правило, более сложны как с точки зрения задействованных структур данных, так и с точки зрения логики, необходимой для их правильной работы в многопоточном приложении. Это означает, что даже если мы игнорируем конструкции синхронизации, он может использовать больше памяти и работать медленнее, хотя степень, в которой это происходит, очень зависит от конкретного рассматриваемого класса