|
|
|
happens before
|
|||
|---|---|---|---|
|
#18+
Привет! Хочу разобраться в том как работает happens before Читаю статью: http://habrahabr.ru/post/133981/ но уже в самом начале: авторpublic class Keeper { private Data data = null; public Data getData() { if(data == null) { synchronized(this) { if(data == null) { data = new Data(); } } } return data; } } не понимаю чем плох этот код, как его можно запустить и проверить, что он плохо работает. Или как то по-другому стоит понять как работает happens before? Почитать, реализовать что то? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 13:31 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
mr_virtusХочу разобраться в том как работает happens before Не заморачивайся. Правда. Рано ещё. Нужно понять одну вещь. Java Memory Model это сложный инструмент доказательства возможных и не возможних исходов некого кода в многопоточном исполнении. Это не то что "работает". Это некоторая "гарантия", которую выдают JVM для определенного кода. mr_virtusне понимаю чем плох этот код, как его можно запустить и проверить, что он плохо работает. Вот и я говорю рано ещё. Отложи на время. Я уже вроде расписывал где-то на форуме. Но найти что-то не могу сходу. Есть синглтон. Он должен быть "ленивым" - создавать instance только когда попросят, но не раньше. Он должен быть потокобезопасным - instance создаётся только 1 раз, даже если первый вызов выполняет сразу несколько потоков. Созданый instance должен после инициализации возвращаться максимально быстро без блокировок потоков. Что и конфликтует с предыдущим требованием. mr_virtusИли как то по-другому стоит понять как работает happens before? Почитать, реализовать что то? Много-много читать про JMM. Например вот тут много толково и подробно разжевано: http://cheremin.blogspot.com/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 13:46 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо Вам большое! Как всегда дельные рекомендации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 14:45 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
http://cheremin.blogspot.com/ блок интересный, но я не смог там найти объяснение happens before. А мне нужно для работы быстро разобраться. Хотя бы базовую концепцию понимать. Может кто объяснит, пожалуйста, либо статью понятную подкинет. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 17:52 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
mr_virtusА мне нужно для работы быстро разобраться. Хотя бы базовую концепцию понимать. Может кто объяснит, пожалуйста, либо статью понятную подкинет. Откуда такая уверенность, что прямо "нужно для работы" Happens before это отношение частично порядка. Оно используется для того чтобы описать, что если операция А произойдёт до операции B, то операция B гарантировано увидит изменения сделанные первой операцией. Ну, попробуй в спеке прочитать https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html Two actions can be ordered by a happens-before relationship. If one action happens-before another, then the first is visible to and ordered before the second. If we have two actions x and y, we write hb(x, y) to indicate that x happens-before y. If x and y are actions of the same thread and x comes before y in program order, then hb(x, y). There is a happens-before edge from the end of a constructor of an object to the start of a finalizer (§12.6) for that object. If an action x synchronizes-with a following action y, then we also have hb(x, y). If hb(x, y) and hb(y, z), then hb(x, z). ИМХО, вполне просто написано. а потом по той же спеке разобраться в примерах где это используется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 17:58 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
mr_virtusА мне нужно для работы быстро разобраться. Хотя бы базовую концепцию понимать.Базовая концепция: на разделяемых (видимых разным потокам) мутабельных переменных всегда ставить модификатор volatile . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:38 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
For AllБазовая концепция: на разделяемых (видимых разным потокам) мутабельных переменных всегда ставить модификатор volatile . А лучше final ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:44 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
For All, если не поставить, то что случится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:48 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо. стало понятней. доку почитаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:49 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, авторОткуда такая уверенность, что прямо "нужно для работы" Спросили про это. А я затруднился с ответом. Говорят - что это базовые вещи в многопоточном программировании. Знать обязательно и пригодится в будущем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:52 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Как вам написали:BlazkowiczHappens before это отношение частично порядка. Оно используется для того чтобы описать, что если операция А произойдёт до операции B, то операция B гарантировано увидит изменения сделанные первой операцией.Так вот, если volatile на мутабельных переменных (типа private Data data из примера про синглтон) не ставить, то нет гарантии, что:Blazkowiczоперация B гарантировано увидит изменения сделанные первой операцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:53 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
For All, ок, спасибо большое. представление появилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 18:57 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
For All, а использовать synchronize вместо volatile нельза из-за то, что при synchronize может возникнуть блокировка? или есть другие причины? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 20:49 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
разобрался с volatile. разные вещи с синхронайз они делают. синхронайз блокирует объект. а волотайл заставляет поток считывать каждый раз требуемые данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 22:58 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
mr_virtusСпросили про это. А я затруднился с ответом. Говорят - что это базовые вещи в многопоточном программировании. Знать обязательно и пригодится в будущем. Те кто так говорят имеют завышеное ЧСВ. Блокировки, взаимоблокировки, синхронизация - это базовые вещи. happens before и JMM это то что далеко не все понимают и могут использовать. HB вообще относится к теории множеств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 21:52 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТе кто так говорят имеют завышеное ЧСВ. Блокировки, взаимоблокировки, синхронизация - это базовые вещи. happens before и JMM это то что далеко не все понимают и могут использовать. HB вообще относится к теории множеств.Не соглашусь. HB - это и есть следствие синхронизации данных между потоками. Если вы не понимаете HB, то вы не умеете писать многопоточный код, выходящий за рамки synchronized. На средних позициях хватит и этого. Топовые позиции требуют понимания HB в обязательном порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 22:16 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
mr_vitusГоворят - что это базовые вещи в многопоточном программировании DEVcoachТоповые позиции требуют понимания HB в обязательном порядке. Топовые, базовые, какая на.. ой. Разница? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2014, 22:18 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
DEVcoachЕсли вы не понимаете HB, то вы не умеете писать многопоточный код, выходящий за рамки synchronizedИспользование java.util.concurrent - это такое тайное знание??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2014, 15:45 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovИспользование java.util.concurrent - это такое тайное знание???В документации к каждому второму классу в j.u.c упоминается happens-before. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2014, 16:11 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
DEVcoachВ документации к каждому второму классу в j.u.c упоминается happens-before.Когда я выбирал класс для реализации пула подключений, то от документации мне потребовались одна вещь - уточнить имя класса ( ArrayBlockingQueue ). Я, конечно, допускаю, что это один из половины классов, где happens-before не упоминается, но чем могло помочь сакральное знание для написания вполне тривиальной обёртки над готовой реализацией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2014, 16:19 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovно чем могло помочь сакральное знание для написания вполне тривиальной обёртки над готовой реализацией ?Вы уже сами ответили на свой вопрос. Существуют нетривиальные задачи, и существуют задачи, когда никакой "готовой реализации" нет. Вот там эти знания и нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2014, 17:31 |
|
||
|
happens before
|
|||
|---|---|---|---|
|
#18+
cdtyjvСуществуют нетривиальные задачи, и существуют задачи, когда никакой "готовой реализации" нет. Вот там эти знания и нужны.Осталось понять, почему эти знания стали базовыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2014, 19:57 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=148&tid=2126115]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 357ms |

| 0 / 0 |
