|
|
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
С коллегой разошлись мнения по сабжу. тут мы сходимся: volatile: Изменения сделанные над volatile переменной видны сразу всем потокам 1 точка зрения(моя) изменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору 2 точка зрения по выходу из syncronized блока все изменения сделанные внутри syncronized сразу видны всем потокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 13:18 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
первое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:25 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner, Для JMM времени не существует. Вот это неправильное рассуждение questionerИзменения сделанные над volatile переменной видны сразу всем потокам JMM вам такого не обещает, она всего лишь говорит, что если поток T2 видит изменение в волатольной переменной X сделанное потоком T1, то T2 также увидит и все остальные изменения сделанные T1 предшествующие записи в X. Но вот про время которое должно пройти, прежде чем T2 увидит запись в X вообщее ничего не говорится. Соответсвенно пункт 2 ошибочен по тем же причинам, А пункт 1 не полон для случая когда внутри синхронизированного блока вы пишете в volatile переменные: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:31 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
авторДля JMM времени не существует Ага, особенно happens-before. автор А пункт 1 не полон для случая когда внутри синхронизированного блока вы пишете в volatile переменные В данном случае synchronized/не synchronized роли не играет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:55 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892авторДля JMM времени не существует Ага, особенно happens-before. Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:47 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestioner, Для JMM времени не существует. Вот это неправильное рассуждение questionerИзменения сделанные над volatile переменной видны сразу всем потокам JMM вам такого не обещает, она всего лишь говорит, что если поток T2 видит изменение в волатольной переменной X сделанное потоком T1, то T2 также увидит и все остальные изменения сделанные T1 предшествующие записи в X. Но вот про время которое должно пройти, прежде чем T2 увидит запись в X вообщее ничего не говорится. Соответсвенно пункт 2 ошибочен по тем же причинам, А пункт 1 не полон для случая когда внутри синхронизированного блока вы пишете в volatile переменные: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true. а вы где увидели, что я про время говорю? vimba getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true ну много разных happens-before бывает. Что конкретно хотите этим показать? я разве где-то писал, что этого не может быть? я всего лишь написал, что есть гарантия, что если мы вышли из блока syncronized, то потом при входе в секцию по тому же монитору мы гарантированно увидим изменения в блоке из которого вышли. Комментарий из разряда "поумничать ради поумничать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:22 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
забыл никno56892пропущено... Ага, особенно happens-before. Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же ну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет) в 10:00:01 другой поток прочитал это значение. и естественно оно для него выглядит актуально. И любой момент времени после 10:00:00 любой поток увидит актуальное значение гарантированно. в 10:00:05 он увидит такое же значение. JMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени. считаю фразу авторИзменения сделанные над volatile переменной видны сразу всем потокам корректной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:32 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner...я разве где-то писал, что этого не может быть?... Да писал, выдиляю специально жирным фрагмент твоего первого поста: questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:38 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerJMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени. Нет не можете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет) в 10:00:01 другой поток прочитал это значение. Либо ЛЮБОЕ ДРУГОЕ, сделанное ранее. гарантия в другое- если второй поток прочитает записанное в 10:00:00 значение, то он прочитает МИНИМУМ всё то, что было выполнено в этом потоке до (в порядке написанного кода) присвоения переменной. А когда до жирафа второго потока дойдёт значение, записанного в первом- в мире многопроцессорных машин с NUMA-архитектурой неизвестно. И пытаться угадать- это прямая дорога в АДЪ. [quote questioner]JMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени.[quote questioner] Нет. questionerсчитаю фразу авторИзменения сделанные над volatile переменной видны сразу всем потокам корректной. Очень зря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:55 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
забыл никno56892пропущено... Ага, особенно happens-before. Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же Оно там подразумевается неявно. A happens-before B означает, что (1) A физически выполняется __до__ B и (2) результаты (актуальное состояние памяти), произошедшие до A включительно видны на момент физического выполнения B. Разве __до__ это не временной термин? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:05 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestioner...я разве где-то писал, что этого не может быть?... Да писал, выдиляю специально жирным фрагмент твоего первого поста: questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору пфф и что тут не так? я до сих пор в этом уверен. В общем случае это абсолютно верно и никак не противоречит использованию волатильных ссылок внутри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:17 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerJMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени. Нет не можете. а время как-бы ордеринг не устанавливает? Когда на билете куда либо пишут, что посадка начинается с какого-то времени. Это ли не ордеринг? просто время делится на фрагменты, которые нам интересны. ну типа переменная будет видна после выполнения инструкции. Выполнения инструкции имеет свойство время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:20 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет) в 10:00:01 другой поток прочитал это значение. Либо ЛЮБОЕ ДРУГОЕ, сделанное ранее. гарантия в другое- если второй поток прочитает записанное в 10:00:00 значение, то он прочитает МИНИМУМ всё то, что было выполнено в этом потоке до (в порядке написанного кода) присвоения переменной. А когда до жирафа второго потока дойдёт значение, записанного в первом- в мире многопроцессорных машин с NUMA-архитектурой неизвестно. И пытаться угадать- это прямая дорога в АДЪ. а что значит дойдёт? что вы под этим подразумеваете? когда второй поток обратится? да в какой бы момент после записи волатильной переменной не обратился, в любой момент и увидит новой значение. опять же у момента записи есть свойство - время, соответственно, транзитивно верно сказать, что после времени записи волатильной переменной любые потоки увидят это обновление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:25 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Тут по-моему и бeз JMM всё очевидно. questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору А почему не будут видны по "другому монитору"? questionerпо выходу из syncronized блока все изменения сделанные внутри syncronized сразу видны всем потокам. synchronized через ch пишеться, если что. Нет, не будут. У каждого потока свой кэш, если один поток в synchronized блоке обновил значение в основной памяти, это ещё не значит что другой поток будет читать это значение не из своего кэша. Если к полю доступ только внутри synchronized, то volatile не обязателен. Если поле видно и в не synchronized секциях, то без volatile можно вычитать значение кэша, а не main memory. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:29 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerпфф и что тут не так? Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:29 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТут по-моему и бeз JMM всё очевидно. questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору А почему не будут видны по "другому монитору"? questionerпо выходу из syncronized блока все изменения сделанные внутри syncronized сразу видны всем потокам. synchronized через ch пишеться, если что. Нет, не будут. У каждого потока свой кэш, если один поток в synchronized блоке обновил значение в основной памяти, это ещё не значит что другой поток будет читать это значение не из своего кэша. Если к полю доступ только внутри synchronized, то volatile не обязателен. Если поле видно и в не synchronized секциях, то без volatile можно вычитать значение кэша, а не main memory. Прошу прощения за ошибку) а не будут видны по другому монитору ибо нет такого happens before. http://stackoverflow.com/a/23961401/2674303 а последний абзац хорош! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:33 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerпфф и что тут не так? Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной. jmm даёт гарантии, то есть как минимум. я не говорю, что ничего другого не будет, я говорю, что при отсутствии каких-то дополнительных условий, которые могут быть можно гарантировать как минимум это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:38 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНет, не будут. У каждого потока свой кэш, если один поток в synchronized блоке обновил значение в основной памяти, это ещё не значит что другой поток будет читать это значение не из своего кэша. Если к полю доступ только внутри synchronized, то volatile не обязателен. Если поле видно и в не synchronized секциях, то без volatile можно вычитать значение кэша, а не main memory. Кстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner, Имеете в виду Вы может быть и что-то своё, но уже несколько человек в этом топике поняло Вас именно так как Вы написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:41 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerпфф и что тут не так? Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной. Если я на фотографии вдалеке вижу силует человека, то я могу гарантировать только то, что это человек, могу гарантировать, что он ест еду и не могу гарантировать, что он может рожать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:42 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerКстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти? Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:45 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerа не будут видны по другому монитору ибо нет такого happens before. http://stackoverflow.com/a/23961401/2674303 Ну, да. Верно. Кэш не единственный способ увидеть другое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:51 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestionerа не будут видны по другому монитору ибо нет такого happens before. http://stackoverflow.com/a/23961401/2674303 Ну, да. Верно. Кэш не единственный способ увидеть другое значение. а можно отсюда поподробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:53 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerКстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти? Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали. Где вам почудилось время то я не могу понять в первом посте? время задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:55 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
*leap ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:57 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionervimbaпропущено... Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали. Где вам почудилось время то я не могу понять в первом посте? Я не правильно интерпритировал сразу , Вы так изъясняетесь что без дополнительных комментариев непонятно что значит сразу, это можно понять и как момент времени, что я собственно и сделал. questionerвремя задаёт ордеринг? И здесь то же самое, у Вас потрясающая способность писать двусмысленные фразы, я лично не понимаю даже из контекста кто-кого задаёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 19:16 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestionerпропущено... Где вам почудилось время то я не могу понять в первом посте? Я не правильно интерпритировал сразу , Вы так изъясняетесь что без дополнительных комментариев непонятно что значит сразу, это можно понять и как момент времени, что я собственно и сделал. questionerвремя задаёт ордеринг? И здесь то же самое, у Вас потрясающая способность писать двусмысленные фразы, я лично не понимаю даже из контекста кто-кого задаёт. время - подлежащее задаёт - сказуемое ордеринг - дополнение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 19:22 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner, Ну и какой порядок задает время? Happens-befor order или Synchronized-with order, или оба сразу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 19:34 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaquestioner, Ну и какой порядок задает время? Happens-befor order или Synchronized-with order, или оба сразу? время задаёт обычный человеческий порядок. happens-before задаёт правила порядка выполнения кода и видимости. Порядок это значит до или после, то бишь одно раньше/после другого. Но это пограничное событие, которое определяет ребро, оно всё равно в какой-то момент времени происходит. То есть время это аттрибут нашего события. И в обычном мире событие, которое происходит после имеет время большее, нежели у этого события, задающее ребро. а вот кстати про Synchronized-with order не слышал. Объясните недвусмысленно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 19:44 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerну много разных happens-before бывает. Что конкретно хотите этим показать? я разве где-то писал, что этого не может быть? я всего лишь написал, что есть гарантия, что если мы вышли из блока syncronized, то потом при входе в секцию по тому же монитору мы гарантированно увидим изменения в блоке из которого вышли. Комментарий из разряда "поумничать ради поумничать" Скорее вопрос. Вы так еще по прошлому не поняли, что означает happens before. Это всего лишь гарантированная точка синхронизации, говорящая, что если видно, что было на момент точки видно и то, что было до того. На самом деле этим отношением показывают взаимодействие в памяти. На самом деле в момент доступа к volatile, началу блока синхронизации, его окончанию, захвату блокировки и т.п. устанавливается барьер для out of order execution и происходит сброс измененного кеша проца в память с инвалидацией соответствующих страниц на других процах. Тем самым появляется гарантия видимости. До этого момента нет гарантии, что изменения будут видны, как впрочем и нет гарантий что они не будут видны, полностью или частично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 23:11 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
vimbaЗабудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали. Кому как удобнее понять. Кому-то "до/после", кому-то "барьер в памяти", кому-то "версия страницы". Главное, чтоб стало понятно, что не поток пройдя сквозь монитор видит актуальное состояние, а наоборот оповещает остальных о том, что он сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 23:25 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerвремя задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно. Очевидное очень часто ложно. В данном случае определенно. Порядок задает исходный код программы. А до или после решает jvm по ходу пьесы. Другими словами Код: java 1. 2. 3. 4. JMM разрешает сделать jvm и сначала инкремент, затем увеличение на два.И сначала увеличение на два, а затем инкремент. И даже сразу присвоение тройки.Но требует, чтобы к моменту работы с потоком эти операции были сделаны полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 23:32 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевСкорее вопрос. Вы так еще по прошлому не поняли, что означает happens before. почему не понял? Сергей АрсеньевЭто всего лишь гарантированная точка синхронизации, говорящая, что если видно, что было на момент точки видно и то, что было до того. Хитро закрученная фраза, несколько раз перечитал с попыткой расставить паузы по разному, не помогло. Помогите мне найти, плиз, гарантии на вход в критическую секцию. Пример приветствуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 00:09 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestionerвремя задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно. Очевидное очень часто ложно. В данном случае определенно. Порядок задает исходный код программы. А до или после решает jvm по ходу пьесы. Другими словами Код: java 1. 2. 3. 4. JMM разрешает сделать jvm и сначала инкремент, затем увеличение на два.И сначала увеличение на два, а затем инкремент. И даже сразу присвоение тройки.Но требует, чтобы к моменту работы с потоком эти операции были сделаны полностью. Вы всё в кучу смешали. я не говорю, что всё, что очевидно это правда. В вашем примере, да, реордеринг может случиться и другой поток может увидеть нечто вгоняющее в ступор, но это особенность JMM. Я лишь говорю, что время это АТТРИБУТ события(1). любое, любое другое событие после события(1) будет иметь время, большее, чем у события(2), а меньшее, меньше, чем у события(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 00:13 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Здорово расписано про все: http://en.cppreference.com/w/cpp/atomic/memory_order на более низком уровне, чем happens-before. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 01:11 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsynchronized через ch пишеться, если что."пишется" без ь пишется, если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 06:51 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerа что значит дойдёт? что вы под этим подразумеваете? Что угодно. JMM это список гарантий. Не более. Все попытки придумать "как это делано"- это пустая трата времени (более того, это запутывает). Волатильность гарантирует только две вещи- атомарность и то, что чтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит. Никаких гарантий, какую запись увидит чтение нет. Вообще никаких. Сброс кэшей и т.п.- это только чьи-то фантазии. Если в JDK 1.8.101 сделано так, то в 1.8.111 может всё быть уже по-другому. Если что-то выпоняется на intel core i7, то на ARM может быть всё другое. А арендовав машину в облаке можно получить что угодно. questionerкогда второй поток обратится? да в какой бы момент после записи волатильной переменной не обратился, в любой момент и увидит новой значение. Откуда, ну откуда Вы это взяли? Никто и нигде такого не обещал. questionerопять же у момента записи есть свойство - время, соответственно, транзитивно верно сказать, что после времени записи волатильной переменной любые потоки увидят это обновление. Такое обязательство (наличие момента времени для каждой операции) снизило бы производительность многоядерной системы на несколько порядков. Поэтому "у момента записи есть свойство - время" - неправда. Чем быстрее Вы это поймёте- тем быстрее поймёте JMM и вообще разработку в многопроцессорной среде. Вся JMM построена на понятии частичного порядка. По сути "если мы видим вот эту запись, то мы видим и вот эти операции точно, а вот эти- может быть". Всё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 09:21 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
> чтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит. Кто на ком сидел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 09:36 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
> оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора" Это большая беда сейчас. Молодёжь не хочет читать формальные спецификации, а полагается на своё "понимание работы процессора". Говорят, что полезно начинать учиться прогать с ассемблера. Сколько я наблюдал таких начавших — все они были подтверждением того, что НЕ полезно. Пишут код исходя из своего "понимания" работы. И когда видят, что компилятор компилирует во что-то, что не соответствует этому "пониманию", начинают бегать везде и вопить о багах в компиляторах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 09:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"). То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 09:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerа что значит дойдёт? что вы под этим подразумеваете? Что угодно. JMM это список гарантий. Не более. Все попытки придумать "как это делано"- это пустая трата времени (более того, это запутывает). Волатильность гарантирует только две вещи- атомарность и то, что чтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит. Никаких гарантий, какую запись увидит чтение нет. Вообще никаких. Сброс кэшей и т.п.- это только чьи-то фантазии. Если в JDK 1.8.101 сделано так, то в 1.8.111 может всё быть уже по-другому. Если что-то выпоняется на intel core i7, то на ARM может быть всё другое. А арендовав машину в облаке можно получить что угодно. Нет уж давайте конкретно. что значит "дойдёт"? Про атомарность это Вы про long и double ? Alexey Tominчтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит. Для видимости внутри одного потока у нас и так есть гарантии(happens before) по JMM. Никакой volatile тут не при делах. Alexey Tominquestionerкогда второй поток обратится? да в какой бы момент после записи волатильной переменной не обратился, в любой момент и увидит новой значение. Откуда, ну откуда Вы это взяли? Никто и нигде такого не обещал. А как же ж нет то? давайте посмотрим на любой код, который работает с volatile, а без него не гарантированно. Alexey Tominquestionerопять же у момента записи есть свойство - время, соответственно, транзитивно верно сказать, что после времени записи волатильной переменной любые потоки увидят это обновление. Такое обязательство (наличие момента времени для каждой операции) снизило бы производительность многоядерной системы на несколько порядков. Поэтому "у момента записи есть свойство - время" - неправда. Чем быстрее Вы это поймёте- тем быстрее поймёте JMM и вообще разработку в многопроцессорной среде. Вся JMM построена на понятии частичного порядка. По сути "если мы видим вот эту запись, то мы видим и вот эти операции точно, а вот эти- может быть". Всё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"). Это похоже на side effect volatile. А как по вашему мы должны определять увидели мы изменение или нет? в коде может как-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 10:26 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
BlazkowiczCommon LispBlazkowicz, подскажи)) На юг.Зачем?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 10:27 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAlexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"). То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода. Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 10:28 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAlexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"). То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода. Знать это надо, не надо это пытаться применять в данном случае :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 10:57 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerBlazkowiczпропущено... То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода. Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что. Зависит от процессора. Это главное, что надо знать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 10:59 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerНет уж давайте конкретно. что значит "дойдёт"? Значит, что второй поток увидит значение, заданное в другом потоке. Через сколько тактов процессора второй поток увидит изменения, сделанные первым- точно неизвестно. questionerПро атомарность это Вы про long и double ? Да, хотя для intel это не актуально, но может стрельнуть на каком-нибудь ARM. questionerAlexey Tominчтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит. Для видимости внутри одного потока у нас и так есть гарантии(happens before) по JMM. Никакой volatile тут не при делах. Да, я неудачно выразился. Если в потоке 1 поменяли значения волательной переменной и в потоке 2 мы это увидели, то мы увидим (во втором потоке) так же все изменения, сделанные в 1м потоке до (внутри одного потока допустимо говорить о порядке) изменения волатильной переменной. Но надо понимать, что можем увидеть и ЕЩЁ какие-то изменения ;) questionerAlexey TominОткуда, ну откуда Вы это взяли? Никто и нигде такого не обещал. А как же ж нет то? давайте посмотрим на любой код, который работает с volatile, а без него не гарантированно. Не путайте "обычно так" и "гарантировано". В этом и проблема, что код с ошибкой работает в 99.9% случаев. Т.е. у заказчика бага будет, а воспроизвести- фиг. questionerЭто похоже на side effect volatile. А как по вашему мы должны определять увидели мы изменение или нет? в коде может как-то? А волатильные переменные и служат флагами. Мы просто ждём, пока увидим изменения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 11:04 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerпропущено... Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что. Зависит от процессора. Это главное, что надо знать. я спросил, что случится, получил ответ, что главное, это надо знать. Что знать то надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 11:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominquestionerНет уж давайте конкретно. что значит "дойдёт"? Значит, что второй поток увидит значение, заданное в другом потоке. Через сколько тактов процессора второй поток увидит изменения, сделанные первым- точно неизвестно. questionerПро атомарность это Вы про long и double ? Да, хотя для intel это не актуально, но может стрельнуть на каком-нибудь ARM. questionerпропущено... Для видимости внутри одного потока у нас и так есть гарантии(happens before) по JMM. Никакой volatile тут не при делах. Да, я неудачно выразился. Если в потоке 1 поменяли значения волательной переменной и в потоке 2 мы это увидели, то мы увидим (во втором потоке) так же все изменения, сделанные в 1м потоке до (внутри одного потока допустимо говорить о порядке) изменения волатильной переменной. Но надо понимать, что можем увидеть и ЕЩЁ какие-то изменения ;) questionerпропущено... А как же ж нет то? давайте посмотрим на любой код, который работает с volatile, а без него не гарантированно. Не путайте "обычно так" и "гарантировано". В этом и проблема, что код с ошибкой работает в 99.9% случаев. Т.е. у заказчика бага будет, а воспроизвести- фиг. questionerЭто похоже на side effect volatile. А как по вашему мы должны определять увидели мы изменение или нет? в коде может как-то? А волатильные переменные и служат флагами. Мы просто ждём, пока увидим изменения. так мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться. Зачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 11:43 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
ну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ? В других случаях я не очень понимаю как мы будем понимать чего нам ждать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 11:49 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerтак мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться. Отсутствие гарантий нельзя проверить. Ещё раз- при любом эксперементе, скорее всего, Вы проблем не увидете. Они вдруг случатся в продакшене. questionerЗачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем? И не надо. Есть гарантии JMM - это всё, что надо знать. questionerну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ? В других случаях я не очень понимаю как мы будем понимать чего нам ждать Нет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 12:51 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerтак мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться. Отсутствие гарантий нельзя проверить. Ещё раз- при любом эксперементе, скорее всего, Вы проблем не увидете. Они вдруг случатся в продакшене. questionerЗачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем? И не надо. Есть гарантии JMM - это всё, что надо знать. questionerну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ? В других случаях я не очень понимаю как мы будем понимать чего нам ждать Нет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. Я понимаю, что эксперимент приведет к провалу, но давайте таки посмотрим на код и умозрительно оценим с точки зрения наших знаний и HB. Без конкретики тяжело говорить. ---------------------------------------------- Кстати по поводу DCL и входа в synchronized секцию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. внутри synchronized (Something.class) мы же всегда увидим корректное значение? То есть то, что DCL без volatile не работает это всего лишь то, что нам придётся захватывать лишний раз монитор и выигрыша в производительности(ради чего и придумана была эта идея) мы не получим, но при этом второй экземпляр синглтона создать нам таки не получится? то есть код thread-safe, но просто тормозной. Я просто под сломанностью понимал другое до этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 13:08 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
авторНет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях. А то, что и все остальное до записи видно - это как side-эффект. автор Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:14 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все. Вот и у меня такие мысли, то есть синглтон работает, но, вероятно, не эффективно, но прям в каждой статье об этом столько ненависти к этому коду и что мол это "очевидно" не будет работать) Вот если ссылка не идиножды меняется, то да, тогда очевидно, что будет бяка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:34 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892, хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка. с другой стороны final вроде гарантирует видимость, а volatile только видимость себя самого гарантирует. я запутался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:44 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerno56892, хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка. Допустим, но volatile жеж гарантирует условно только саму себя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях. Цитату, пожалуйста. Где это написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:31 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:34 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerКстати по поводу DCL и входа в synchronized секцию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. внутри synchronized (Something.class) мы же всегда увидим корректное значение? Нет. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Все "доказатильства" вида "да я миллион раз выполнил и всегда не null" ничего не говорят про то, что через год не выйдет новая прошивка процессора и версия jvm, в которых это ВДРУГ не стрельнёт в одном случае из миллиона. Современные процессоры очень сложны. Как работают все его оптимизации, спекулятивные ветки и т.п. знает очень мало людей и, поверьте, это не Вы и не я. Поверх идёт ещё (не самый очевидный) оптимизатор jvm. Который тоже понимают, мягко говоря, не все. Плюс будущие процессоры (включая принципиально новые архитектуры). Плюс куча компиляторов (C1, C2, ibm'овский, excelsior graal, ищё чего есть и чего БУДЕТ). Код надо писать по спецификации. Всё остальное- путь сильного духом и слабого умом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:42 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties Точнее даже так. Тут написано, что ЕСЛИ случился subsequent read ТО будет happens-before. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:45 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? Во-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominПоток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.Вы хотите сказать, что в point 2 он может опять "увидеть" null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominА теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины.А как можно "увидеть", кроме как прочитав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:53 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerAlexey Tomin. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? У Вас ниже аргументация ещё более зыбкая - "я думаю" questionerВо-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу happens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:55 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892Alexey Tomin, пропущено... https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. Вы писали: авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Он ее увидит как только прочитает ее, т.е. сразу. А Вы написали, что если увидит запись в волатайл, то типа увидит и все, что было до нее. Т.е. может и не увидеть. Я же говорил о том, что все чтения видят предыдущие записи с volatile. Вот здесь и нужен фактор времени, который Вы отрицали, как мне показалось. Так как два+ потока не могут одновременно писать/читать в одну ячейку памяти, то кто-то из них по времени физически это сделает раньше. Вот что я хотел сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:58 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Common LispAlexey TominПоток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.Вы хотите сказать, что в point 2 он может опять "увидеть" null? Я хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null. Кстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков. Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:01 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tominпропущено... А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. Вы писали: авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Он ее увидит как только прочитает ее, т.е. сразу. Нет такого. В спецификации сказано, что он может прочитать любое более старое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:02 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerпропущено... Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? У Вас ниже аргументация ещё более зыбкая - "я думаю" questionerВо-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу happens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. А какая разница? Допустим синглтон объект вообще без полей (конструктор пустой), т.е. в ссылке может быть ЛИБО null ЛИБО ссылка на готовый объект, при каких обстоятельствах чтение instance будет не null, а return null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:03 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892пропущено... Вы писали: пропущено... Он ее увидит как только прочитает ее, т.е. сразу. Нет такого. В спецификации сказано, что он может прочитать любое более старое значение. Цитату плиз) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:05 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominЯ хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null.Что-то мне кажется, что у вас паранойя. JMM подробно пока не читал, знаком с C++11 memory model, которая выглядит более мозговывернутой, чем JMM. Так вот, если значение в одном потоке может смениться с null на не-null и другой поток увидел не-null, то старое значение — null — он уже никогда не увидит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:10 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin[ У Вас ниже аргументация ещё более зыбкая - "я думаю" Вы тоже не приводите обличающих и бесспорных аргументов) Alexey Tominhappens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. Ну вот хотелось бы прув на это, я не говорю, что это не так, просто я нигде такого не видел среди прочитанного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:10 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominCommon Lispпропущено... Вы хотите сказать, что в point 2 он может опять "увидеть" null? Я хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null. Кстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков. Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно. а в чем разница? какое здесь h-b появляется дополнительно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:15 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.Во всех доках пишется, что чтения из volatile не оптимизируются (путём кэширования в регистрах), а всегда делаются обращением к памяти, а это несколько другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:22 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionersyncronized vs volatile с точки зрения visibility synchronized и volatile - работают в неразрывной связке. Visibility обеспечивается за счет volatile . (точка) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:28 |
|
||
|
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 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Они никуда не утрачены, ссылка на объект в памяти не изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:30 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tominпропущено... "Я не могу придумать, как процессор это сделает"- никак не аргумент. В таком случае покажите как когерентность кэшэй не допустит случая, который я описал. Тут вопрос о чём мы говорим. "Засыпание и просыпание" не ломает hb - тут есть некоторые гарантии OS (я тоже этот вариант придумал, но на joker'е сказали, что "да без этого и single-thread работать не будет ия согласен). Другое дело, что искать как сломается работа- это неправильный путь. Гарантий нет- значит может быть что угодна. А как оно может быть- вопрос забавный- очень подходит для разговора под пивко , но к JMM отношения не имеющий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:32 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892пропущено... В таком случае покажите как когерентность кэшэй не допустит случая, который я описал. Тут вопрос о чём мы говорим. "Засыпание и просыпание" не ломает hb - тут есть некоторые гарантии OS (я тоже этот вариант придумал, но на joker'е сказали, что "да без этого и single-thread работать не будет ия согласен). Другое дело, что искать как сломается работа- это неправильный путь. Гарантий нет- значит может быть что угодна. А как оно может быть- вопрос забавный- очень подходит для разговора под пивко , но к JMM отношения не имеющий. Так я же говорю про случай где как раз таки нет happens before. То, что не ломает hb это ясно, вопрос в том, когда его нету. Вполне логично было бы предположить, что чтение происходит из разных кэшэй, а разные кэши - разные ядра. Ну да ладно, меня такой вариант развития событий устраивает для обоснования такого чуда))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:37 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892В таком случае покажите как когерентность кэшэй не допустит случая, который я описал.Первоначально линии логических схем могли находится только в двух состояниях и, типично, объединялись по схеме монтажного или. Затем добавилось третье (высокимпедансное) состояние, в котором отключенная линия не влияла на сигналы, выдаваемые другими линиями. Затем добавилась возможность чтения уровней шины линией, находящейся в третьем состоянии. У кэша есть два основных режима работы - сквозная запись (write-through) и отложенная запись (write-back). Режим по умолчанию - сквозная запись, при которой на шину выдаются адреса, по которым идут обращения. Процессоры (ядра) умеют считывать (snooping) эти адреса и, если режим обращения указывает на запись - процессор (ядро) пометит соответствующую строку в своём кэше как невалидную. Если найдёт, конечно. Дальше, вроде бы, всё очевидно. И это я ещё не упомянул ни явные команды инвалидации кэша (i486+) ни всяческих "барьеров памяти" (просто знаю, что есть). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:38 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Usman, Дак это же наиобычнейший happens-before, там много как его можно заиметь помимо volatile и synchronized. Java SE API -> java.util.concurrent вниз прокрутить справа там все очень емко расписано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:42 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominЕсть. Она гарантирует hb.Это гарантирует JMM. И это - дополнительная гарантия сверх базовой.Как оно будет обеспечено- вопрос другой.Другой. И неважный.Надо понимать, что до второго процессора записанное значение всё одно дойдёт нескоро.Скоро или нескоро влияет только на цену happens-before. Собственно, процессору совершенно необязательно записать значение в основную память - более чем достаточно начать специальный цикл на шине, "увидев" который "потенциально заинтересованные" "замрут в ожидании". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 17:46 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovСобственно, процессору совершенно необязательно записать значение в основную память - более чем достаточно начать специальный цикл на шине, "увидев" который "потенциально заинтересованные" "замрут в ожидании". Всё одно- блокировка не может дойти сразу. Вопрос только в размере задержки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 18:02 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominВсё одно- блокировка не может дойти сразу.Не согласен - если блокировка критична, то сначала делаются подготовительные приседания и только потом подаётся основное блюдо. Т.е. процессор должен сначала оповестить "я меняю этот адрес" и только потом начать записывать новое значение. P.S. Нет, я, конечно, не знаю как оно в реальности работает ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 18:06 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Дак это же наиобычнейший happens-beforeопять же, который достигается за счет volatile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 18:14 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Usmanno56892Дак это же наиобычнейший happens-beforeопять же, который достигается за счет volatile но без пары с synchronized ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 18:54 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovAlexey TominВсё одно- блокировка не может дойти сразу.Не согласен - если блокировка критична, то сначала делаются подготовительные приседания и только потом подаётся основное блюдо. Т.е. процессор должен сначала оповестить "я меняю этот адрес" и только потом начать записывать новое значение. P.S. Нет, я, конечно, не знаю как оно в реальности работает ... Наверное. Т.е. возможно, что "сразу после" присвоения volatile-переменной в другом потоке прочитается новое значние. И я ошибся- оно не может прочитать более старое значение. Но суть-то не в этом. Не надо сравнивать моменты времени. Это лишнее. Просто операции с volatile объектами всегда можно выстроить в порядок, причём он одинаковый для всех читателей. Введения понятия времени только запутывает дело. Есть "раньше-позже" для конкретных операций, а время тут лишнее. Я вот запутался в них :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 19:16 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominПошла работа- ждём очередь записи, обновляем сквозь все три уровня кэша строчку- это сотни тактов. Сотни! Кто сказал, что соседний процессор замер в предвкушении? Нет, конечно. Он жуёт свои кэши (инвалиадировать кэшлайн пока данные не в ОЗУ нельзя, а то опять фигня прочитается). Когда запись из первого пройдёт- ему прилетит инвализация строки кэша. Да, тут он остановится и начнёт перечитывать строку кэша. Но "сразу" уже давно прошло Ну так говорится же, что сразу после окончания записи данные будут видны всем потокам. После, видимо, всех этих сотен тактов. Запись длительная операция, возможно даже синхронная (ну как вариант). Противоречий не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 22:49 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questioner Ну так говорится же, что сразу после окончания записи данные будут видны всем потокам. После, видимо, всех этих сотен тактов. Запись длительная операция, возможно даже синхронная (ну как вариант). Противоречий не вижу. Вот тут очень долго это все обсуждали, в итоге пришли к тому, что ситуация когда поток так и не увидит запись волатильной переменной другого потока НЕ ПРОТИВОРЕЧИТ JMM. С оговоркой что в реальности такой кейс представить сложно. http://cs.oswego.edu/pipermail/concurrency-interest/2012-August/009816.html http://stackoverflow.com/questions/11761552/detailed-semantics-of-volatile-regarding-timeliness-of-visibility ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 00:03 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerНу так говорится же, что сразу после окончания записи данные будут видны всем потокам. После, видимо, всех этих сотен тактов. Запись длительная операция, возможно даже синхронная (ну как вариант). Противоречий не вижу. По сути, вопрос времени только запутывает. Просто для другого потока "сразу" наступает в какой-то отложенный момент. В какой- вопрос интересный, НО не описанный никак в JMM (я вчера много чего там прочитал). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 06:28 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerВ вашем примере, да, реордеринг может случиться и другой поток может увидеть нечто вгоняющее в ступор, но это особенность JMM. Я лишь говорю, что время это АТТРИБУТ события(1). любое, любое другое событие после события(1) будет иметь время, большее, чем у события(2), а меньшее, меньше, чем у события(1). Скорее шкала. Но дело в том, что если в потоке А произошли события 1 и 2, то в другом потоке они не произошли, а соответственно нет возможности понять какое было раньше какое позже. Поэтому придумали способ - синхронизацию. В какой-то момент времени поток Б гарантированно узнает, что события 1 и 2 произошли. Поскольку он так же може подглядывать в память доступную потоку А, то и до этого по результатам подглядывания он может догадаться о том какое из событий произошло. Но смотрит он через произвольную нарезку кадров (что-то из того что он считал из памяти актуально, а что-то как лежало в его кеше от начала времен, так и лежит). Поэтому у него инет гарантий до точки синхронизации в его шкале времени в что произошло в соседнем потоке, а что нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 09:24 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerвнутри synchronized (Something.class) мы же всегда увидим корректное значение? Вопрос не в том, что ты увидишь внутри . Положим туда попал поток А. То (1) захватываем монитор (делаем грань h-b) (2)проверяем на null если да (3)создаем один экземпляр класса, (4)ссылку на него записываем по адресу instance (5) выходим из монитора и создаем (h-b грань). Вопрос в том, что ты увидишь снаружи. Если поток B прочел память в которую попал объект Somthing() где-то между моментами 1 и 5, а потом прочел этот адрес, то для него действует грань h-b момента 1 - а там before ничего не было, т.е. может пользоваться состоянием кеша на этот момент (не совсем так, частично в ходе инициализации new Somthing() будет еще одна грань, но она до конструктора). Необходимо, чтобы момент окончания конструктора попал за грань, после которой будет чтение адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 09:45 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovВот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками. И не на TSO архитектуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 09:47 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestionerвнутри synchronized (Something.class) мы же всегда увидим корректное значение? Вопрос не в том, что ты увидишь внутри . Положим туда попал поток А. То (1) захватываем монитор (делаем грань h-b) (2)проверяем на null если да (3)создаем один экземпляр класса, (4)ссылку на него записываем по адресу instance (5) выходим из монитора и создаем (h-b грань). Вопрос в том, что ты увидишь снаружи. Если поток B прочел память в которую попал объект Somthing() где-то между моментами 1 и 5, а потом прочел этот адрес, то для него действует грань h-b момента 1 - а там before ничего не было, т.е. может пользоваться состоянием кеша на этот момент (не совсем так, частично в ходе инициализации new Somthing() будет еще одна грань, но она до конструктора). Необходимо, чтобы момент окончания конструктора попал за грань, после которой будет чтение адреса. Как я понял всё это сводится к тому, что если даже мы увидили не в synchronized секции новое значение, то нет гарантии, что при повторном чтении без acquire мы вновь увидим его же. Просто это кажется интуитивно понятным, но вот, к сожалению, не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 09:51 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerКак я понял всё это сводится к тому, что если даже мы увидили не в synchronized секции новое значение, Не в повторном чтении, а в другом чтении. Там нет гарантии, что если ты увидел адрес объекта, то он полностью создан. Другими словами, если в нем есть некоторое поле, которое программа гарантированно считает не null, ибо конструктор его таким делает, то ты можешь увидеть его null или поле x будет установлено, а поле y еще нет и т.п. Потому что нужна гарантия на то, что конструктор до чтения ссылки. А для этого нужна гарантия конструктор до записи ссылки. На x86 все более менее просто. На других архитектурах jvm приходится плясать ужом и операция получается не такой простой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 10:01 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНе в повторном чтении, а в другом чтении. А в чем разница между терминами? Сергей АрсеньевТам нет гарантии, что если ты увидел адрес объекта, то он полностью создан. Другими словами, если в нем есть некоторое поле, которое программа гарантированно считает не null, ибо конструктор его таким делает, то ты можешь увидеть его null или поле x будет установлено, а поле y еще нет и т.п. Потому что нужна гарантия на то, что конструктор до чтения ссылки. А для этого нужна гарантия конструктор до записи ссылки. На x86 все более менее просто. На других архитектурах jvm приходится плясать ужом и операция получается не такой простой. Тут по-момему глаголов не хватает. я не понял, что Вы имеете виду. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Если конкретно, то если в AAA увидели не null, то при повторном чтении в BBB ссылки из this.instance может быть даже null ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 10:08 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Common LispAlexey TominЯ хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null.Что-то мне кажется, что у вас паранойя. JMM подробно пока не читал, знаком с C++11 memory model, которая выглядит более мозговывернутой, чем JMM. Так вот, если значение в одном потоке может смениться с null на не-null и другой поток увидел не-null, то старое значение — null — он уже никогда не увидит.Ладно, я, видимо, не прав. Это гарантируется только для атомиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 12:37 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerСергей АрсеньевНе в повторном чтении, а в другом чтении. А в чем разница между терминами? повторное чтение это чтение того же самого еще раз. А другое это чтение чего-то другого. Грубо говоря чтение ссылки в цикле и чтение того на что указывает ссылка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 11:18 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerЕсли конкретно, то если в AAA увидели не null, то при повторном чтении в BBB ссылки из this.instance может быть даже null Ну типа ААА выполнялось на процессоре 1, потом бац перелетели на процессор 2, кеш никто не сбросил и опана мы в BBB с null в кеше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 11:25 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
А вот то, что BBB вернет ссылку на объект все конструкторы которого не отработали до конца это вполне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 11:28 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Пытался продраться сквозь топик (звездные войны уже начались)... ;-) что может быть полезно новичкам практически по поводу подлянок с volatile: у volatile разница с atomic в том что чтение и запись в volatile переменную является atomic операцией. volatile int varOne; varOne = 5; int x = varOne; Но есть ньюанс - комбинация операций чтения и записи над volatile переменной не являются atomic. varOne = varOne + 1; или varOne++; Во втором случае разные потоки могут поменять значение varOne в произвольный момент, те если varOne = 5 то не гарантируется varOne++ равный 6 (может быть изменен другим потом в процессе вычисления ++ так как это не одна операция а чтение и запись). Смотрим документацию по synchronized : Each action in a thread happens-before every action in that thread that comes later in the program's order. An unlock (synchronized block or method exit) of a monitor happens-before every subsequent lock (synchronized block or method entry) of that same monitor. And because the happens-before relation is transitive, all actions of a thread prior to unlocking happen-before all actions subsequent to any thread locking that monitor . A write to a volatile field happens-before every subsequent read of that same field. Writes and reads of volatile fields have similar memory consistency effects as entering and exiting monitors, but do not entail mutual exclusion locking. A call to start on a thread happens-before any action in the started thread. All actions in a thread happen-before any other thread successfully returns from a join on that thread. На первый взгляд, видимость (новое значение переменных) гарантируется только для потоков ждущих тот же самый лок, на котором был synchronized block. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 13:09 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 13:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевuid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется я старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии. Большинству мало интересны ньансы JSR 133 (есть только не разрабатывает JDK) а готовые решения и паттерны для новичков необходимы сразу. Для практического применения удобно использовать связанные локи на чтение и на запись, к примеру ReentrantLock Можно взять лок на чтение, на запись, взять лок одним потоком а другим потокам дать проскочить. Все просто, понятно и достаточно быстро, не настолько дубово (неэффективно) как synchronized или примитивно как volatile (не всегда к месту). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:05 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:08 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid uniqueя старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии. Ну я тоже передернул. Согласованного в том смысле, что если он увидит запись, то он увидит и те записи (включая другие переменные), которые были до того, если больше они ничем не перезаписывались. А кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:21 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня. Лучшие друзья дев... пардон программистов в потоках это dead lock-и. И низкая производительность от избыточного локирования ресурсов. synchronized ни в коем случае не плохая вещь, просто ссылку дал на ReentrantReadWriteLock может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:40 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:49 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевuid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :) Можно все типовое руками написать (раньше так и было но JDK 5 дело пошло веселее) только скорее всего это уже есть в jdk и лучше время потратить на бизнес логику в своем проекте. Отладка низкоуровневых суповых наборов дело непростое - ковырнешь в одном месте, в другом отвалится, полного покрытия тестами как правило не бывает под многопоточность и вылезет проблема под высокой нагрузкой уже в продакшн (к примеру), пусть даже не в нем а недалеко от него, все равно плохо будет. И отлаживать нелегко, поэтому лучше писать так чтобы новичок с ходу понимал. Eще одна полезняшка из высокоуровневых интерфейсов - Condition . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 18:22 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
забыл никВот тут очень долго это все обсуждали, в итоге пришли к тому, что ситуация когда поток так и не увидит запись волатильной переменной другого потока НЕ ПРОТИВОРЕЧИТ JMM. Но это сильно специфично надо трактовать jsr-133A write to a volatile field happens-before every subsequent read of that volatile Где говорится, что запись в volatile находится в отношении "была до" любого последующего чтения. Причем это явно не про один и тот же поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 09:06 |
|
||
|
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", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только. Думаю правда, но не это главная проблема DCL. Нашёл ответ в concurrency in practice: concurency in practisethe real problem with DCL is the assumption that the worst thing that can happen when reading the shared object reference without synchronization is to erroneously see a stale value (in this case, null); in that cse the DCL idiom compensates for this risk by trying again with the lock held. But the worst case is actually considerably wrong - it is possible to see a current value of the reference but stale values for the object's states, meaning that the object could be seen to be in an invalid or incorrect state. В итоге получаем, что если на момент публикации volatile переменной в объекте были выставлены поля, то мы как минимум на этот момент их увидим. Но если мы сначала присвоили volatile, а потом начали менять состояние объекта, на который указывает ссылка( выставлять поля), то гарантий нет. Что же касается final, то как я и думал магический freeze action всё сделает за нас. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. в книге приведен в точности до имен пример как пример безопасной публикации. Наконец-то разобрался) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2017, 22:55 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123178]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
126ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 420ms |

| 0 / 0 |
