|
|
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
Читаю http://www.javaspecialist.ru/2011/06/java-memory-model.html Отношение happens-before так же накладывает сильные ограничения на reordering. С точки зрения потока Y все операцие произошедшие до точки happens-before в потоке X он может рассматривать как операции свершившиеся в своем собственном потоке. Т.е. никакого логического reordering по сравнению с прямым порядком в исходном коде с точки зрения потока Y быть не может. Если взглянуть внимательнее на границу happens-before с точки зрения reordering для потока Y, то никакие операции располагающиеся выше границы happens-before в потоке X, не могут выполнится ниже границы happens-before в результате reordering, однако, операциям, находящимся ниже границы, разрешено выполнение до неё. Более наглядно это изображено на рисунке. и такая картинка там имеется: Оба абазаца не понял. По первому абазацу: 1. Что такое логический реордеринг? (автор имеет ввиду, то что все операции просто завершились к моменту HB? или обязательно он увидит, что строка 3 выполнится раньше строки 4? хотя я тут вообще не понимаю. Ведь я так понимаю мысинкаемся только в момент HB. В общем я не понял, что хотел сказать автор) 2. Вот Картинка вообще в ступор вгоняет. Если поменять местами 3 и 4 строка, то работать ничего не будет, а вот если 4 и 3, то всё будет огонь. Что за бред? P.S. Что такое реордеринг, я знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 19:41 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
Тем же внизу есть комментарии, спросите у автора напрямую, будет быстрее может. Ну помимо того, что здесь спросили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 20:00 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
questioner, questionerЕсли поменять местами 3 и 4 строка, то работать ничего не будет, а вот если 4 и 3, то всё будет огонь. Что за бред? Стрелочки там не про перестановку строк 3 и 4, а вот про этот текст: никакие операции располагающиеся выше границы happens-before в потоке X, не могут выполнится ниже границы happens-before в результате reordering, однако, операциям, находящимся ниже границы, разрешено выполнение до неё Т.е. «x=1» не может быть выполнено после «unlock M», однако что-то, стоявшее после «unlock M», вполне может быть выполнено до unlock. Присмотритесь, они же не стыкуются со строкой 4, а начинаются/заходят за неё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 20:29 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
vslquestioner, questionerЕсли поменять местами 3 и 4 строка, то работать ничего не будет, а вот если 4 и 3, то всё будет огонь. Что за бред? Стрелочки там не про перестановку строк 3 и 4, а вот про этот текст: никакие операции располагающиеся выше границы happens-before в потоке X, не могут выполнится ниже границы happens-before в результате reordering, однако, операциям, находящимся ниже границы, разрешено выполнение до неё Т.е. «x=1» не может быть выполнено после «unlock M», однако что-то, стоявшее после «unlock M», вполне может быть выполнено до unlock. Присмотритесь, они же не стыкуются со строкой 4, а начинаются/заходят за неё. Да, спасибо, второй вопрос снят. остаётся только первый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 21:51 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
Happens-before это отношение между операциями, а не какой-то конкретный момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 22:07 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
questioner2. Вот Картинка вообще в ступор вгоняет. Если поменять местами 3 и 4 строка, то работать ничего не будет, а вот если 4 и 3, то всё будет огонь. Что за бред?Очень важный момент: как освобождение/захват монитора, так и записать/чтение в volatile переменную связаны отношением happens-before, только если операции проводятся над одним и тем же экземпляром объекта . По картинке: Если в Thread A значение X присвоение происходит между lock/unlock (т.е. синхронно), то в другом Thread B значение переменной X, которая была изменена в Thread A, будет видна (предположим, что под "глазом" находится оператор println X) - благодаря тому, что обе операции чтения и записи в/из переменную в обоих потоках - синхронизированы! (и println X выведет на экран 1) А теперь, если вынесем присвоение (X=1) в Thread A за пределы синхро-блока (и переменная при этом не volatile), Thread B не сможет увидеть новые изменения (т.е. X=1). Почему? В каждом ядре/процэ есть свой кэш, который не синхронный с основной памятью. И если два потока выполняются на разных ядрах/процах значения этих переменных могут быть разными. Соответственно, для получения актуальных данных из памяти (и записи тоже) мы должны пользоваться синхро-блоками. Вот! (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 03:55 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
Usman Thread B не сможет ВЕРОЯТНЕЕ ВСЕГО НЕ увидит новые изменения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 04:05 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
questioner1. Что такое логический реордеринг? (автор имеет ввиду, то что все операции просто завершились к моменту HB? или обязательно он увидит, что строка 3 выполнится раньше строки 4? хотя я тут вообще не понимаю. Ведь я так понимаю мысинкаемся только в момент HB. В общем я не понял, что хотел сказать автор) Немного странный термин, этот "логический реордеринг". По сути- находясь в другом потоке (например на другом процессоре с NUMA-памятью) мы можем увидеть изменение пееременных в другом порядке- просто потому, что в "наш" кэш они доедут по-другому. questioner2. Вот Картинка вообще в ступор вгоняет. Если поменять местами 3 и 4 строка, то работать ничего не будет, а вот если 4 и 3, то всё будет огонь. Что за бред? Она не о том. Процессор может выполнить любую операцию, которая написана после "unlock M" в первом потоке ДО этого unlock. Даже если это x=2 Но не может выполнить ни одной операции, написанной до unlock после unlock. Т.е., другими словами, любая операция может быть перемещена в минхронизированный блок, но вынесена из него быть не может. Такая чёрная дыра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 09:13 |
|
||
|
JMM ликбез
|
|||
|---|---|---|---|
|
#18+
questionerи такая картинка там имеется: Кстати, глядя на эту картинку надо помнить, что lock M в thread B может случится ДО lock M в thread A. Чисто случайно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 09:14 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2123326]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
84ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 410ms |

| 0 / 0 |
