|
|
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Usmanquestionersyncronized vs volatile с точки зрения visibility synchronized и volatile - работают в неразрывной связке. Visibility обеспечивается за счет volatile . (точка) Запятая. не всегда, чтобы гарантировать видимость нужен volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:31 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
И вообще - прежде чем обсуждать поведение "у меня всегда так получается", не худо было бы протестировать (свои) предположения на, как минимум, двухголовой железке. Вот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:33 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается. А вот вариант: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не safe", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:35 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerUsmanпропущено... synchronized и volatile - работают в неразрывной связке. Visibility обеспечивается за счет volatile . (точка) Запятая. не всегда, чтобы гарантировать видимость нужен volatile. https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.3 For example, in the following (broken) code fragment, assume that this.done is a non-volatile boolean field : Код: java 1. 2. The compiler is free to read the field this.done just once , and reuse the cached value in each execution of the loop. This would mean that the loop would never terminate , even if another thread changed the value of this.done . теперь точка (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:37 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovИ вообще - прежде чем обсуждать поведение "у меня всегда так получается", не худо было бы протестировать (свои) предположения на, как минимум, двухголовой железке. Вот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками. а кто обсуждает "у меня всегда так получается" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:46 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Usmanquestionerпропущено... Запятая. не всегда, чтобы гарантировать видимость нужен volatile. https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.3 For example, in the following (broken) code fragment, assume that this.done is a non-volatile boolean field : Код: java 1. 2. The compiler is free to read the field this.done just once , and reuse the cached value in each execution of the loop. This would mean that the loop would never terminate , even if another thread changed the value of this.done . теперь точка (: я про запись и чтение в synchronized секции по одному монитору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается. А вот вариант: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не safe", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только. А можно для тех, кто в танке разжевать? зачем локальная переменная? какое h-b она добавляет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значениеАнрыл. Подсказка - когерентность кэша . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:56 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner, Оно не добавляет hb, оно решает проблему по которой instance может вернуть сначало не null в if-е, а в return null. То есть тут один раз читаем, и если null - мы заходим в synchronized там hb и все такое, если нет - ее же и возвращаем. Usman, а как насчет такого: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:00 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovno56892поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значениеАнрыл. Подсказка - когерентность кэша . А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:02 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892 Код: java 1. cheat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:02 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovno56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.Во всех доках пишется, что чтения из volatile не оптимизируются (путём кэширования в регистрах), а всегда делаются обращением к памяти, а это несколько другое. В каких доках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:04 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerAlexey TominКстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности: ... Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно. а в чем разница? какое здесь h-b появляется дополнительно? Возможные варианты второго потока. 1. на первой строке из this.instance прочитан не null. Он и вернётся. Другого нет, т.к. у нас локальная переменная, которая не меняется, если прочитали не null. 2. на первой строке null, в синхронном блоке не null - мы внутри синхронного блока, можем читать переменную сколько угодно раз, т.к. вне блока она не меняется. 3. на первой строке null, в синхронном блоке null - тут бага у меня- надо так же instance = this.instance сделать- тогда, мы точно получим нужное значение. Т.е. на всех трёх ветках будет возвращён не null. Расписывать через hb мне лень. Что дважды конструктор не вызовется доказывать надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:09 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tominпропущено... Нет такого. В спецификации сказано, что он может прочитать любое более старое значение. Цитату плиз) Найду. Но не сразу- jmm в оригинале не самое простое чтение, а найти быстро то, где Шипелёв это явно и с выражением говорит- ещё сложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:10 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Basil A. Sidorovпропущено... Анрыл. Подсказка - когерентность кэша . А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд. "Я не могу придумать, как процессор это сделает"- никак не аргумент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:12 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892А вот вариант: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Чем хуже простое: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:12 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominВ каких доках?Собирательно-иносказательно. Или есть возражения по базовой трактовке директивы volatile? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:14 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Дважды не вызовется, но вот если конструктор в синглтоне не "safe", например такой: Код: java 1. 2. 3. то зафэйлится (при доступе к полю можем и 0 схватить при условии, что получили объект через "race read"), а так нет: Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:16 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Код: java 1. У вас здесь два чтения, это же как раз выше и обсуждалось, при первом чтении будет объект а при втором может и null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:18 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд.Получиться что? Несинхронность кэшей двух ядер, между которыми планировщик перебрасывает потоки? Лично я исхожу из презумпции разумности: код планировщика создавался людьми, которые не только лучше нас разбираются в вопросе, но и могут отлаживаться на весьма экзотических системах. Это даже если забыть о том, что делают разработчики процессоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:20 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892пропущено... А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд. "Я не могу придумать, как процессор это сделает"- никак не аргумент. В таком случае покажите как когерентность кэшэй не допустит случая, который я описал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:21 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЧем хуже простое: Код: sql 1. 2. 3. 4. 5. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:23 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892У вас здесь два чтения, это же как раз выше и обсуждалось, при первом чтении будет объект а при втором может и null.Угу. В нереальном сценарии дубиноголовых разработчиков процессоров и операционных систем. Нет, я могу представить режим работы процессора, в котором можно получить такой эффект, но я не могу представить систему, работающую в таком режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:25 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovAlexey TominВ каких доках?Собирательно-иносказательно. Или есть возражения по базовой трактовке директивы volatile? Есть. Она гарантирует hb. Как оно будет обеспечено- вопрос другой. Надо понимать, что до второго процессора записанное значение всё одно дойдёт нескоро. Записали. Сказали "сбрось нафиг кэш". Пошла работа- ждём очередь записи, обновляем сквозь все три уровня кэша строчку- это сотни тактов. Сотни! Кто сказал, что соседний процессор замер в предвкушении? Нет, конечно. Он жуёт свои кэши (инвалиадировать кэшлайн пока данные не в ОЗУ нельзя, а то опять фигня прочитается). Когда запись из первого пройдёт- ему прилетит инвализация строки кэша. Да, тут он остановится и начнёт перечитывать строку кэша. Но "сразу" уже давно прошло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:26 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tomin, Дважды не вызовется, но вот если конструктор в синглтоне не "safe", например такой: Код: java 1. 2. 3. то зафэйлится От этого ничего не спасёт. Если прочитаны данные "под гонкой" то они испорчены необратимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39395714&tid=2123178]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
59ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 362ms |

| 0 / 0 |
