Есть ли какой-то недостаток в использовании потоковобезопасных коллекционных классов, таких как Hashtable, в однопотоковой среде? - PullRequest
2 голосов
/ 25 апреля 2019

Интервьюер спросил меня о недостатках использования потокового класса, такого как Hashtable, в однопоточной среде?Есть ли недостатки?если нет, то почему появился класс, не поддерживающий потоки?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Интервьюер спросил меня о недостатках использования потокового класса, такого как Hashtable, в однопоточной среде?

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

если нет, то почему появился класс, не поддерживающий потоки?

Не поточно-ориентированные объекты всегда работают лучше, чем их поточно-ориентированные аналоги в однопоточных или многопоточных приложениях. Способность работать с локальной кэш-памятью ЦП является одним из основных увеличений скорости, обеспечиваемых современным оборудованием. Если вам не нужно обращаться к шине основной памяти, вы можете выполнять операции на несколько порядков быстрее. Конструкции синхронизации уменьшают возможность использования кэш-памяти.

Наконец, поточно-ориентированные классы, как правило, более сложны как с точки зрения задействованных структур данных, так и с точки зрения логики, необходимой для их правильной работы в многопоточном приложении. Это означает, что даже если мы игнорируем конструкции синхронизации, он может использовать больше памяти и работать медленнее, хотя степень, в которой это происходит, очень зависит от конкретного рассматриваемого класса

1 голос
/ 25 апреля 2019
  1. Они медленнее в однопоточной среде. Современный JIT очень эффективен при работе с синхронизированным классом в однопоточной среде, но он не идеален.
  2. Они намного медленнее в многопоточной среде. Если у вас есть неизменяемая коллекция, вы можете безопасно использовать ее из разных потоков, но синхронизированная коллекция будет работать намного медленнее.
  3. [дизайн] Его семантика блокировки в основном бесполезна, поэтому в любом случае требуется дополнительная синхронизация. Вам редко нужно просто читать или писать, большую часть времени вы читаете, а затем пишете, и вы хотите, чтобы оно было атомарным. Или вы хотите разрешить несколько одновременных чтений.
...