|
|
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
на хабре вычитал 2 реализации синглтона РАЗ Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. два Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Почему в первом случае не надо volatile ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:24 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90на хабре вычитал 2 реализации синглтона РАЗ Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. два Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Почему в первом случае не надо volatile ? P.S. С сабжектом я погорячился) http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java вот тут почему-то в топе не нашёл ответов с DCL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:59 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
volatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный. Вот при чем тут енумы (из заголовка) - загадка :) А мне нравится такой синглтон: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:02 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Как же вы заколебали своим DCL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:15 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
ivanra, Да, видимо про синглтон на енумах думал и написал)) а во втором случае ведь тоже синхронайзд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:23 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКак же вы заколебали своим DCL. Эта эмоция мне нравится. У меня складывается, что DCL какая-то антинаучная х... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:25 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90Эта эмоция мне нравится. Потому что это уже 3й или 5й топик про DCL. redwhite90У меня складывается, что DCL какая-то антинаучная х... Это как раз научная исследовательская фигня, которая к практическому применению имеет слабое отношение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:31 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Blazkowiczredwhite90Эта эмоция мне нравится. Потому что это уже 3й или 5й топик про DCL. redwhite90У меня складывается, что DCL какая-то антинаучная х... Это как раз научная исследовательская фигня, которая к практическому применению имеет слабое отношение. проясните тогда плиз в чем с точки зрения науки разница между первым и вторым случаем и нафига надо локальная копия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:46 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90проясните тогда плиз в чем с точки зрения науки разница между первым и вторым случаем и нафига надо локальная копия? Для потокобезопасной ленивой инициализации, которая бы исключала взаимоблокировки потоков при доступе к уже проинициализированному синглтону. spinlock, по-моему, сводит проблему взаимоблокировки к минимуму. Поэтому её оптимизация выглядит сомнительной. Опять же, практических сценариев, где такое нужно почти не встречается. А там где встречается, можно применить более простой и не менее эффективный код. Поэтому DCL это сугубо академическая проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:00 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90, вот хорошая статья про dcl (к сожалению, автор спрятал, но в архивах всё найдется): https://web.archive.org/web/20121108114236/http://habrahabr.ru/post/143390/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:13 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90BlazkowiczКак же вы заколебали своим DCL. Эта эмоция мне нравится. У меня складывается, что DCL какая-то антинаучная х... Потому что давно есть другое решение, проще. Всё за нас делает jvm. А DCL - это просто разминка для ума. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 08:30 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Уже второй пишет holder для singleton без final. Вы предполагаете, что его потом можно будет поменять? DCL практически не нужен, когда singleton 1 и можно положиться на внутренний механизм jvm с блокировками при загрузке класса. Другое дело, когда getter выглядит, например, так: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:11 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевУже второй пишет holder для singleton без final. Вы предполагаете, что его потом можно будет поменять? DCL практически не нужен, когда singleton 1 и можно положиться на внутренний механизм jvm с блокировками при загрузке класса. Другое дело, когда getter выглядит, например, так: Код: java 1. нет, но не думаю, что это баг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 12:29 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Alexey Tominredwhite90пропущено... Эта эмоция мне нравится. У меня складывается, что DCL какая-то антинаучная х... Потому что давно есть другое решение, проще. Всё за нас делает jvm. А DCL - это просто разминка для ума. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. It depends... Если new Singleton() может выкинуть эксепшен, например при инициализации нужно вычитать настройки синглтона из какого-то внешнего хранилища, и в момент конструирования синглтона это хранилище в дауне, то тут два варианта: 1. Требования таковы что программа не должна продолжать работать - тогда действительно проще всего положиться на JDK, ошибка при инициализации класса SingletonHelper будет приводить к NoClassDefFoundError для вех последующих обращений к методу getInstance класса Singleton. 2. Ежели требования таковы что нужно дать клиентам второй шанс на инициализацию синглтона, то тут уже нам и понадобится понимание DCL. Я правда не понимаю зачем в таком кейсе платить за volatile, когда можно положиться на гарантии безопасной публикации для final полей используя холдер с final полем: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 15:47 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
redwhite90... и нафига надо локальная копия? В данном случае локальная копия не нужна, так как судя по коду инициализация синглтона полностью происходит в конструкторе. Страшилки про локальную переменную нужны, когда класс синглтона не полностью инициализируется своим конструктором и нужно на нем еще всякие сеттеры подергать. В таком кейсе локальная переменная нужна для того чтобы не опубликовыть недоинициализированный объект раньше времени, вот например если так написать без локальной переменной то может случиться что-то нехорошее: public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { // FAIL! опубликованна ссылка на недоинициализированный объект. instance = new Singelton(); instance.setSomething(System.getProperty("blah-blah")); } } } return instance ; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 15:56 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
черт забыл отформатировать: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 16:07 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКак же вы заколебали своим DCL. Эта тема действительно раз в квартал всплывает в топиках. Будоражит всем моск. Тонет и потом неизбежно снова возвращается. В другой инкарнации. Но суть - та-же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 21:14 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Alexey TominПотому что давно есть другое решение, проще. Всё за нас делает jvm. А DCL - это просто разминка для ума. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Синглтон - это не обязательно "что-то в одном экземпляре на класслоадер", как в вашем случае. Это может быть что-то с "в одном экземпляре на инстанс некоторого объекта"; что-то, что нужно грузить максимально лениво; что-то, что надо иногда обнулять, и т.д.. И для всех этих случаев ваше решение не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 21:33 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
Никакая это не разминка для ума. Разминка для ума - это Гипотеза Римана. А эта хрень требует исторических знаний что было в Java 1.4 и потом Java 5. Потом она требует рисования диаграммы состояний. И обзначения стрелками "что" и "зачем" инстанциируется. И для двух и более потоков рассмотреть кейсы гонок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 21:47 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
cdtyjv, синглтон с холдером - ленивый, так же, как и его обфусцированный вариант на енумах. Всё остальное - верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 10:02 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
ivanravolatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный. Вот при чем тут енумы (из заголовка) - загадка :) А мне нравится такой синглтон: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Ребят объясните этот выделенный коммент. Вот в вики в разделе happens before пишут об этом моменте, но мне непонятно почему он работает именно так и как это достигается. Разве volatile-переменная не убирает просто оптимизацию сохранения переменной в кеш ядра процессора? Т.е если я убираю volatile на двухядерной машине и создаю два потока таким образом что каждый выполняется на отдельном ядре что происходит в этом случае - переменная не убирается в кеш? или второй поток когда до него дойдет время уже получит обновленное значение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2015, 09:27 |
|
||
|
volatile and synchronized в енумах
|
|||
|---|---|---|---|
|
#18+
OracleLoverivanravolatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный. Ребят объясните этот выделенный коммент. Вот в вики в разделе happens before пишут об этом моменте, но мне непонятно почему он работает именно так и как это достигается. Блокировкой. Соответственно в HB нельзя переходить ее. Грубо говоря нельзя прочитать instance до захвата блокировки, а захватить до отпускания ранее проинициализировавшим класс потоком. А поток не сможет отпустить блокировку раньше окончания инициализации. Так должна быть устроена jvm. OracleLoverРазве volatile-переменная не убирает просто оптимизацию сохранения переменной в кеш ядра процессора? На самом деле нет. То что описываете Вы - это механизм, при помощи которого он достигается. Volatile обеспечивает согласованный доступ к переменной с сериализацией по времени. Ну и HB до кучи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2015, 12:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38925342&tid=2124829]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 537ms |

| 0 / 0 |
