|
|
|
Синхронизация синглетона
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33808644&tid=2148487]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
168ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 455ms |

| 0 / 0 |
