|
|
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Добрый день всем участникам форума! позвольте задать такой вопрос: У меня есть класс построенный по шаблону Singleton. Экземпляр этого класса используется в мультипоточном контексте (сервлетами). Для создания экземпляра класса использую фабрику: Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Так как экземпляр класса MySingleton используется очень часто, разумеется мне не понравилось что при получении ссылки на него приходится вызывать синхронизированный метод getInstance. Тогда я сделал вторую фабрику: Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. у фабрики MegaFactory есть метод getMySingleton который не синхронизирован, тем не менее синхрнонизация используется внутри него при условии если объект класса MySingleton не создан. Потом у меня возникла идея отказаться от этой фабрики и сделать таким образом: Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Скажите пожалуйста, правильно ли я сдеал? Какой из этих вариантов лучший? Или синхронизация не нужна вообще в этой задаче? Спасибо за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 11:23 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
извините, теги оказывается другие тут... У меня есть класс построенный по шаблону Singleton. Экземпляр этого класса используется в мультипоточном контексте (сервлетами). Для создания экземпляра класса использую фабрику: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Так как экземпляр класса MySingleton используется очень часто, разумеется мне не понравилось что при получении ссылки на него приходится вызывать синхронизированный метод getInstance. Тогда я сделал вторую фабрику: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. у фабрики MegaFactory есть метод getMySingleton который не синхронизирован, тем не менее синхрнонизация используется внутри него при условии если объект класса MySingleton не создан. Потом у меня возникла идея отказаться от этой фабрики и сделать таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Скажите пожалуйста, правильно ли я сдеал? Какой из этих вариантов лучший? Или синхронизация не нужна вообще в этой задаче? Спасибо за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 11:24 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
По-моему, в последнем варианте всё равно надо синхронизировать метод. --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 12:24 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
2 unicornmirage: В первом случае все правильно, код должен быть synchronized. Второй вариант не имеет смысл (с точки зрения того для чего вы его писали), так как метод getMySingleton() все равно вызывает внутри себя synchronized метод getInstance(). Третий вариант правильный. Первый вариант хуже третьего в производительности (так как поток должен все равно выполнить проверку условия), но лучше в обслуживании (можно обрабатывать исключения). Третий вариант лучше первого в производительности, но хуже в обслуживании (данный метод инициализации не позволяет обрабатывать исключения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 14:29 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
OU. Третий вариант лучше первого в производительности, но хуже в обслуживании (данный метод инициализации не позволяет обрабатывать исключения). а какие здесь могут возникнуть исключения? конфликт доступа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 14:47 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 15:38 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
а так? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 16:39 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Jozicа так? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Так нельзя. Читай про Double-checked locking. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 17:24 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
SqlLoaderТак нельзя. Читай про Double-checked locking.спасибо :) http://www-128.ibm.com/developerworks/java/library/j-dcl.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 18:59 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Мистер Блох советует делать это вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Joshua BlochThe idiom takes advantage of the guarantee that a class will not be initialized until it is used [JLS, 12.4.1]. When the getFoo method is invoked for the first time, it reads the field FooHolder.foo, causing the FooHolder class to get initialized. The beauty of this idiom is that the getFoo method is not synchronized and performs only a field access, so lazy initialization adds practically nothing to the cost of access. The only shortcoming of the idiom is that it does not work for instance fields, only for static fields. ====================== - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 04:06 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
2 Роман: По видимому код не полный, т.к он не совсем подходит под приведенное описание. В частности нет members getFoo и foo. Если не затруднит то не могли бы вы привести ссылку на оригинал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 14:58 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
OU2 Роман: По видимому код не полный, т.к он не совсем подходит под приведенное описание. В частности нет members getFoo и foo. Если не затруднит то не могли бы вы привести ссылку на оригинал. foo = instance; getFoo = getInstance; Извини, бездумно скопировал текст с Блоха, а исходники чуточку переименовал. Саму книгу можно скачать из библиотеки уважаемого Грасоff-а: http://lib.swapj.net/books/effective-java-programming-language-guide.zip Глава 9, задача 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 15:09 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
2 Роман: спасибо, пойду гляну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 15:34 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманМистер Блох советует делать это вот так: Решение изящное, но возможно по невежеству возникают два вопроса. Нельзя ли коротко прояснить их? 1. Зачем делать внутренний класс? Статический член того же класса, по идее, должен сработать не хуже, инициализируясь при первом использовании класса, то есть в большинстве случаев - при первом вызове getInstance(). 2. А дает ли это реальный выигрыш, учитывая, что где-нибудь внутри неявно вызванного getClass() будет та же самая синхронизация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 23:30 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
softwarer Кувалдин РоманМистер Блох советует делать это вот так: Решение изящное, но возможно по невежеству возникают два вопроса. Нельзя ли коротко прояснить их? 1. Зачем делать внутренний класс? Статический член того же класса, по идее, должен сработать не хуже, инициализируясь при первом использовании класса, то есть в большинстве случаев - при первом вызове getInstance(). 2. А дает ли это реальный выигрыш, учитывая, что где-нибудь внутри неявно вызванного getClass() будет та же самая синхронизация? Не знаю, но поскольку Блох один из разработчиков языка - склонен ему верить. Желания ковыряться в исходниках JRE у меня нет :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2006, 19:09 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2006, 13:45 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Syncronized там просто потому что я не очень крутой джавист и не уверен до конца, что статическая секция может быть выполнена несколько раз из разныхпотоков. но уверен что оно там не нужно WBR, Malkolinge ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2006, 13:47 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
окончательній вариант Код: plaintext 1. 2. Malkolinge ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2006, 13:48 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
1. Синхронизация на неинициализированный член object приводит к NullPointerException. 2. Блох хотел сказать, что пока не вызван метод getInstance() класса FooSingleton, экземпляр этого класса создан не будет. Вызов метода getInstance() приведет к инициализации статических членов класса FooHolder, в частности instance. В результате будет создан экземпляр класса FooSingleton.В принципе, такой вариант эквивалентен варианту 1 первого поста, но порождает еще один класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2006, 14:18 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
SqlLoader Jozicа так? ... Так нельзя. Читай про Double-checked locking. Зато так всегда работало. для C# или в java Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. есть сомнения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2006, 23:36 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, сразу не вкурил в вышеописанную муть. Да, так наверное будет работать. Но во первых вложенная синхронизация, а во вторых дополнительный объект мне очень не нравятся. ====================== - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 00:07 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман ska...есть сомнения?... Есть А зря :-)) В статеечке конечно всё верно, и про volatile в том числе (а были ссылочки на еще одну аналогичную статейку от IBM), но беда этих статей в том что все они говорят как нельзя, но не упоминают (или мало и нежизненно) как можно. Если Вам удастся показать (хотя бы предположить теоретически) где в моём примере может быть прокол (можно с кодами из разных JIT - x86, x64, pa-risc, power, sparc, ia64) - сниму шляпу. А вообще идея в том что "synchronized(a)" нельзя обойти или соптимизировать. Я конечно не беру 1.1.7 Symantec JIT который еще не соблюдал правила по synchronized. Сергей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 00:18 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманИзвиняюсь, сразу не вкурил в вышеописанную муть. Да, так наверное будет работать. Но во первых вложенная синхронизация, а во вторых дополнительный объект мне очень не нравятся. Так вот как раз без этой вложенной синхронизации (и не по тому же самому обьекту) и нарываемся на проблемы. Черт с ней - ведь это только 1 раз, зато все остальные вызовы пойдут без синхронизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 00:23 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
unicornmirage ваш второй вариант верен и обычно называется двойное проверкой. метод новый делать не обязательно, достаточно написать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. насчет вашего третьего примера, он рабочий только инициализация экземпляра синглтона будет происходить не в момент первого обращения, а при загрузке класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 10:50 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
MalkoLinge Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Мне кажется, этот вариант хорош, если синглтон простой. А если экземпляр занимает много памяти или удерживает ресурсы, которые сильно влияют на производительность? Т.е. синглтон создастся, но может никогда не понадобиться.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 16:53 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
funikovyuri unicornmirage ваш второй вариант верен и обычно называется двойное проверкой. метод новый делать не обязательно, достаточно написать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вот как раз этот пример ошибочен и не работает. И вышеуказанные статеечки как раз на эту тему и на грабли эти наступалось много раз разными людями. Проблема в том что oneInst становится не null еще до того как закончилось конструирование объекта. Другая thread берет ентот недоношенный объект и всё вместе улетает в SIGSEGV... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 18:32 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
artgonch MalkoLinge Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Мне кажется, этот вариант хорош, если синглтон простой. А если экземпляр занимает много памяти или удерживает ресурсы, которые сильно влияют на производительность? Т.е. синглтон создастся, но может никогда не понадобиться.... Вообще то это NullPointerException называется. Конечно, ежели можно обойтись статическим конструированием так конечно проще Код: plaintext 1. и никаких synchronized не нужно, но проблема в том что по разным причинам так написать редко удается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 18:42 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
ska funikovyuri unicornmirage ваш второй вариант верен и обычно называется двойное проверкой. метод новый делать не обязательно, достаточно написать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вот как раз этот пример ошибочен и не работает. И вышеуказанные статеечки как раз на эту тему и на грабли эти наступалось много раз разными людями. Проблема в том что oneInst становится не null еще до того как закончилось конструирование объекта. Другая thread берет ентот недоношенный объект и всё вместе улетает в SIGSEGV... почитал статью... чето у меня большие сомнения на ее счет. кто-нибудь проверял на рабочем коде те утверждения? В спецификации на jvm кажется есть требования атомарности операция над всеми базовыми типами кроме double... т.е. очень интересно не приувеличивают ли гаи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 10:59 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri: ваш вариант неверен, смотрите Effective Java Programming Language Guide (chapter 9, item 48), там все описано подробно. Переделывайте скорее ваши синглтоны :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 12:39 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
funikovyuri почитал статью... чето у меня большие сомнения на ее счет. кто-нибудь проверял на рабочем коде те утверждения? В спецификации на jvm кажется есть требования атомарности операция над всеми базовыми типами кроме double... т.е. очень интересно не приувеличивают ли гаи! На SIGSEGV я сам нарвался на многопроцессорной HP PA-RISC. Для х86 в статьях тоже были фрагменты ассемблерного кода. Конструирование объекта отнюдь не атомарная операция :-)) Что касается атомарности - я бы на long на 32-битных тачках тоже не закладывался, ну и в любом случае без synchronized на разных CPU разные значения получить легко. Если говорить о конкретном примере unicornmirage - он будет работать только потому что класс MySingleton не содержит ни одной динамической переменной. Если он будет содержать только переменные базового типа, то тоже выживем, но значения непредсказуемые получим, ну а уж если ссылки на объекты, то SIGSEGV :-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 18:36 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
ska На SIGSEGV я сам нарвался на многопроцессорной HP PA-RISC. Вот бы код приводящий к такой ошибке уведеть ska Конструирование объекта отнюдь не атомарная операция :-)) вы открыли мне глаза... я где-то писал что конструктор это атомарная операция? Насчет же того что переменной присваивается ссылка не еще не сконструированный объект - опять же очень хочу ссылки на примеры и на спецификацию jvm ska Что касается атомарности - я бы на long на 32-битных тачках тоже не закладывался, ну и в любом случае без synchronized на разных CPU разные значения получить легко. Ну вы можете и не закладываться, а так это требования спецификации на jvm авторOU У меня к сожалению этой книги сейчас нет, не могли бы привести выдержки из нее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 19:10 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri: здесь можно скачать книгу, иначе копировать много придется, нехочется форум захламлять лишним. click ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 19:21 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
funikovyuri ska На SIGSEGV я сам нарвался на многопроцессорной HP PA-RISC. Вот бы код приводящий к такой ошибке уведеть Для х86 Jozic уже приводил ИБМовскую ссылку . Смотрите Listing 6. Вообще то это все сильно давешняя история и лично я не знаю ни одной реализации 1.4 где была бы эта плюха - все реализации сначала конструируют а уж затем присваивают ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 20:26 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
ska Вообще то это все сильно давешняя история и лично я не знаю ни одной реализации 1.4 где была бы эта плюха - все реализации сначала конструируют а уж затем присваивают ссылку. вот вот, хотелось бы все выяснить до конца. Есть мнение что это уже давно не актуально... ЗЫ у меня есть куча многопроцессорных боксов и разных jvm - мало только времени.... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 13:19 |
|
||
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#18+
funikovyuri вот вот, хотелось бы все выяснить до конца. Есть мнение что это уже давно не актуально... Поддерживаю это мнение, хотя могу утверждать лишь то что на последних 1.4.2 на следующих платформах это не проявлялось: hpux pa-risc 11.11, hpux ia64 11.23, ibm aix 5.3, sparc solaris 9, win32, win-x64, win-ia64, as/400, ibm z/os. С другой стороны от шаловливых ручек реализаторов JIT никто не застрахован, так что "береженого Бог бережет" ((C) Copyright Монашка) Лично я на такого рода неприятности нарывался на pa-risc и rs6000 оба jdk1.2. До этого (jdk 1.0.2, 1.1.7, 1.1.8) все работало, после 1.2 до 1.4.2 не проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2006, 18:42 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2148487]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 468ms |

| 0 / 0 |
