синглтон и производительность - PullRequest
3 голосов
/ 07 июня 2011

Привет: у меня есть многопоточная Java-программа. Есть много синглетонов. Мне интересно, снизит ли синглтон производительность многопоточной программы, особенно пропускную способность. Некоторые Singleton - это просто один объект, некоторые singleton - concurrentHashmap и / или atomicinteger.

Ответы [ 3 ]

8 голосов
/ 07 июня 2011

Если ваши синглтоны неизменны, то это не приведет к снижению производительности.

Однако, как вы сказали, если в вашем коде есть параллельные (synchronized) синглеты структуры данных, то ваша производительность будетуменьшилось по сравнению с непараллельными структурами данных.

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

Короче говоря, я не думаю, что наличие синглетонов в параллельных системахбудет иметь существенное влияние на производительность, если они не содержат структуру данных, обновленную несколькими потоками.

2 голосов
/ 07 июня 2011

Если вы синхронизируете какой-либо объект, все потоки должны будут ждать блокировки этого объекта перед выполнением синхронизированного блока кода.Другие потоки будут стоять в очереди, ожидая снятия блокировки.Вывод, синхронизация на экземплярах singleton или классе singleton приведет к снижению производительности.Проще говоря, снижение производительности является фактором степени детализации блокировки;если вы выполняете синхронизацию с одним методом, имеющим n методов, все потоки должны будут ожидать только одной блокировки, даже если они попытались выполнить n различных методов.

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

С другой стороны, если вы вообще не синхронизируете на синглтоне (намеренно, потому что нет общих данных), то использование синглетонов не приведетв снижении производительности.

0 голосов
/ 07 июня 2011

Единственные издержки, связанные с наличием синглетонов, - это издержки синхронизации, потому что одноэлементные объекты обычно имеют состояние.Если они не имеют состояния, это похоже на любой другой метод Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...