powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / syncronized vs volatile с точки зрения visibility
135 сообщений из 135, показаны все 6 страниц
syncronized vs volatile с точки зрения visibility
    #39394576
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С коллегой разошлись мнения по сабжу.

тут мы сходимся:
volatile:
Изменения сделанные над volatile переменной видны сразу всем потокам

1 точка зрения(моя)
изменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору
2 точка зрения
по выходу из syncronized блока все изменения сделанные внутри syncronized сразу видны всем потокам.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394681
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394688
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class Future {

    private volatile boolean completed;
    private Object value;

    public synchronized void complete(Object value) {
         if (completed) {
              return;
         }
         this.value = value;
         this.completed = true;
    }

    public Optional<Object> getIfCompleted() {
         if (completed) {
             return Optional.of(value);
         }
         return Optional.empty();
    }

}


getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394727
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДля JMM времени не существует
Ага, особенно happens-before.
автор А пункт 1 не полон для случая когда внутри синхронизированного блока вы пишете в volatile переменные
В данном случае synchronized/не synchronized роли не играет.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394797
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892авторДля JMM времени не существует
Ага, особенно happens-before.


Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394903
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
public class Future {

    private volatile boolean completed;
    private Object value;

    public synchronized void complete(Object value) {
         if (completed) {
              return;
         }
         this.value = value;
         this.completed = true;
    }

    public Optional<Object> getIfCompleted() {
         if (completed) {
             return Optional.of(value);
         }
         return Optional.empty();
    }

}


getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true.

а вы где увидели, что я про время говорю?


vimba getIfCompleted монитор не захватает, однако в нем гарантированно будет видно value в ветке где completed = true

ну много разных happens-before бывает. Что конкретно хотите этим показать?
я разве где-то писал, что этого не может быть? я всего лишь написал, что есть гарантия, что если мы вышли из блока syncronized, то потом при входе в секцию по тому же монитору мы гарантированно увидим изменения в блоке из которого вышли.

Комментарий из разряда "поумничать ради поумничать"
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394913
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никno56892пропущено...

Ага, особенно happens-before.


Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же

ну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет)
в 10:00:01 другой поток прочитал это значение. и естественно оно для него выглядит актуально. И любой момент времени после 10:00:00 любой поток увидит актуальное значение гарантированно.
в 10:00:05 он увидит такое же значение. JMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени.

считаю фразу

авторИзменения сделанные над volatile переменной видны сразу всем потокам
корректной.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394919
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner...я разве где-то писал, что этого не может быть?...


Да писал, выдиляю специально жирным фрагмент твоего первого поста:
questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394921
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerJMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени.
Нет не можете.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394928
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет)
в 10:00:01 другой поток прочитал это значение.

Либо ЛЮБОЕ ДРУГОЕ, сделанное ранее.
гарантия в другое- если второй поток прочитает записанное в 10:00:00 значение, то он прочитает МИНИМУМ всё то, что было выполнено в этом потоке до (в порядке написанного кода) присвоения переменной.
А когда до жирафа второго потока дойдёт значение, записанного в первом- в мире многопроцессорных машин с NUMA-архитектурой неизвестно. И пытаться угадать- это прямая дорога в АДЪ.

[quote questioner]JMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени.[quote questioner]

Нет.

questionerсчитаю фразу
авторИзменения сделанные над volatile переменной видны сразу всем потокам
корректной.
Очень зря.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394937
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никno56892пропущено...

Ага, особенно happens-before.


Все правильно сказали, для JVM понятие время неопредлено. А вот понятие ordering как раз и определяется посредством JMM, что очевидно не одно и то же
Оно там подразумевается неявно. A happens-before B означает, что (1) A физически выполняется __до__ B и (2) результаты (актуальное состояние памяти), произошедшие до A включительно видны на момент физического выполнения B. Разве __до__ это не временной термин?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394944
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestioner...я разве где-то писал, что этого не может быть?...


Да писал, выдиляю специально жирным фрагмент твоего первого поста:
questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору


пфф и что тут не так?


я до сих пор в этом уверен. В общем случае это абсолютно верно и никак не противоречит использованию волатильных ссылок внутри.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394946
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerJMM определяет ордеринг, но при этом мы можем привязывать этот ордеринг и ко времени.
Нет не можете.

а время как-бы ордеринг не устанавливает?

Когда на билете куда либо пишут, что посадка начинается с какого-то времени. Это ли не ордеринг?

просто время делится на фрагменты, которые нам интересны.

ну типа переменная будет видна после выполнения инструкции. Выполнения инструкции имеет свойство время.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394949
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tominquestionerну вот допустим , что поток 1 в 10:00:00 минут изменил значение в волатильной переменной(и больше не меняет)
в 10:00:01 другой поток прочитал это значение.

Либо ЛЮБОЕ ДРУГОЕ, сделанное ранее.
гарантия в другое- если второй поток прочитает записанное в 10:00:00 значение, то он прочитает МИНИМУМ всё то, что было выполнено в этом потоке до (в порядке написанного кода) присвоения переменной.
А когда до жирафа второго потока дойдёт значение, записанного в первом- в мире многопроцессорных машин с NUMA-архитектурой неизвестно. И пытаться угадать- это прямая дорога в АДЪ.



а что значит дойдёт? что вы под этим подразумеваете?

когда второй поток обратится? да в какой бы момент после записи волатильной переменной не обратился, в любой момент и увидит новой значение.

опять же у момента записи есть свойство - время, соответственно, транзитивно верно сказать, что после времени записи волатильной переменной любые потоки увидят это обновление.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394951
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут по-моему и бeз JMM всё очевидно.

questionerизменения сделанные внутри syncronized блока будут гарантированно видны только в syncronized блоке по тому же монитору

А почему не будут видны по "другому монитору"?

questionerпо выходу из syncronized блока все изменения сделанные внутри syncronized сразу видны всем потокам.
synchronized через ch пишеться, если что.

Нет, не будут. У каждого потока свой кэш, если один поток в synchronized блоке обновил значение в основной памяти, это ещё не значит что другой поток будет читать это значение не из своего кэша. Если к полю доступ только внутри synchronized, то volatile не обязателен. Если поле видно и в не synchronized секциях, то без volatile можно вычитать значение кэша, а не main memory.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394952
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerпфф и что тут не так?

Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394955
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

а последний абзац хорош!
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394958
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerпфф и что тут не так?

Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной.

jmm даёт гарантии, то есть как минимум. я не говорю, что ничего другого не будет, я говорю, что при отсутствии каких-то дополнительных условий, которые могут быть можно гарантировать как минимум это.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394960
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНет, не будут. У каждого потока свой кэш, если один поток в synchronized блоке обновил значение в основной памяти, это ещё не значит что другой поток будет читать это значение не из своего кэша. Если к полю доступ только внутри synchronized, то volatile не обязателен. Если поле видно и в не synchronized секциях, то без volatile можно вычитать значение кэша, а не main memory.

Кстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394961
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Имеете в виду Вы может быть и что-то своё, но уже несколько человек в этом топике поняло Вас именно так как Вы написали.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394962
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerпфф и что тут не так?

Я же уже показал пример, который опровергает обязательность захвата монитора для определенных краегульных случаев. Вы или мой пример опровергните, либо согласитесь что категоричность заявлений только в вашем первом посте была неуместной.

Если я на фотографии вдалеке вижу силует человека, то я могу гарантировать только то, что это человек, могу гарантировать, что он ест еду и не могу гарантировать, что он может рожать
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394964
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти?
Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394967
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа не будут видны по другому монитору ибо нет такого happens before. http://stackoverflow.com/a/23961401/2674303

Ну, да. Верно. Кэш не единственный способ увидеть другое значение.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394968
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerа не будут видны по другому монитору ибо нет такого happens before. http://stackoverflow.com/a/23961401/2674303

Ну, да. Верно. Кэш не единственный способ увидеть другое значение.

а можно отсюда поподробнее?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394969
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerКстати если следовать этой теории, то при входе в synchronized секцию получается кеш потока обновляется из основной памяти?
Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали.
Где вам почудилось время то я не могу понять в первом посте?

время задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394971
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*leap
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394978
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionervimbaпропущено...
Забудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали.
Где вам почудилось время то я не могу понять в первом посте?

Я не правильно интерпритировал сразу , Вы так изъясняетесь что без дополнительных комментариев непонятно что значит сразу, это можно понять и как момент времени, что я собственно и сделал.

questionerвремя задаёт ордеринг?

И здесь то же самое, у Вас потрясающая способность писать двусмысленные фразы, я лично не понимаю даже из контекста кто-кого задаёт.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394981
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestionerпропущено...

Где вам почудилось время то я не могу понять в первом посте?

Я не правильно интерпритировал сразу , Вы так изъясняетесь что без дополнительных комментариев непонятно что значит сразу, это можно понять и как момент времени, что я собственно и сделал.

questionerвремя задаёт ордеринг?

И здесь то же самое, у Вас потрясающая способность писать двусмысленные фразы, я лично не понимаю даже из контекста кто-кого задаёт.

время - подлежащее
задаёт - сказуемое
ордеринг - дополнение
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394986
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Ну и какой порядок задает время? Happens-befor order или Synchronized-with order, или оба сразу?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39394989
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vimbaquestioner,

Ну и какой порядок задает время? Happens-befor order или Synchronized-with order, или оба сразу?

время задаёт обычный человеческий порядок.

happens-before задаёт правила порядка выполнения кода и видимости. Порядок это значит до или после, то бишь одно раньше/после другого. Но это пограничное событие, которое определяет ребро, оно всё равно в какой-то момент времени происходит. То есть время это аттрибут нашего события. И в обычном мире событие, которое происходит после имеет время большее, нежели у этого события, задающее ребро.


а вот кстати про Synchronized-with order не слышал. Объясните недвусмысленно?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395038
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerну много разных happens-before бывает. Что конкретно хотите этим показать?
я разве где-то писал, что этого не может быть? я всего лишь написал, что есть гарантия, что если мы вышли из блока syncronized, то потом при входе в секцию по тому же монитору мы гарантированно увидим изменения в блоке из которого вышли.

Комментарий из разряда "поумничать ради поумничать"
Скорее вопрос. Вы так еще по прошлому не поняли, что означает happens before.
Это всего лишь гарантированная точка синхронизации, говорящая, что если видно, что было на момент точки видно и то, что было до того.
На самом деле этим отношением показывают взаимодействие в памяти.
На самом деле в момент доступа к volatile, началу блока синхронизации, его окончанию, захвату блокировки и т.п. устанавливается барьер для out of order execution и происходит сброс измененного кеша проца в память с инвалидацией соответствующих страниц на других процах. Тем самым появляется гарантия видимости.
До этого момента нет гарантии, что изменения будут видны, как впрочем и нет гарантий что они не будут видны, полностью или частично.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395039
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vimbaЗабудте о кешах и о времени, JMM специально Вам дана, чтобы Вы об этих двух понятиях программируя, многопоточный код на java никогда не думали.
Кому как удобнее понять. Кому-то "до/после", кому-то "барьер в памяти", кому-то "версия страницы".
Главное, чтоб стало понятно, что не поток пройдя сквозь монитор видит актуальное состояние, а наоборот оповещает остальных о том, что он сделал.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395041
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerвремя задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно.
Очевидное очень часто ложно. В данном случае определенно.
Порядок задает исходный код программы. А до или после решает jvm по ходу пьесы.
Другими словами
Код: java
1.
2.
3.
4.
int i=0;
i++;
i+=2;
System.out.println(i);


JMM разрешает сделать jvm и сначала инкремент, затем увеличение на два.И сначала увеличение на два, а затем инкремент. И даже сразу присвоение тройки.Но требует, чтобы к моменту работы с потоком эти операции были сделаны полностью.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395047
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевСкорее вопрос. Вы так еще по прошлому не поняли, что означает happens before.
почему не понял?
Сергей АрсеньевЭто всего лишь гарантированная точка синхронизации, говорящая, что если видно, что было на момент точки видно и то, что было до того.
Хитро закрученная фраза, несколько раз перечитал с попыткой расставить паузы по разному, не помогло.


Помогите мне найти, плиз, гарантии на вход в критическую секцию. Пример приветствуется.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395048
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerвремя задаёт ордеринг? да,задаёт(ну кроме lip second). По-моему, очевидно.
Очевидное очень часто ложно. В данном случае определенно.
Порядок задает исходный код программы. А до или после решает jvm по ходу пьесы.
Другими словами
Код: java
1.
2.
3.
4.
int i=0;
i++;
i+=2;
System.out.println(i);


JMM разрешает сделать jvm и сначала инкремент, затем увеличение на два.И сначала увеличение на два, а затем инкремент. И даже сразу присвоение тройки.Но требует, чтобы к моменту работы с потоком эти операции были сделаны полностью.

Вы всё в кучу смешали. я не говорю, что всё, что очевидно это правда. В вашем примере, да, реордеринг может случиться и другой поток может увидеть нечто вгоняющее в ступор, но это особенность JMM. Я лишь говорю, что время это АТТРИБУТ события(1). любое, любое другое событие после события(1) будет иметь время, большее, чем у события(2), а меньшее, меньше, чем у события(1).
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395062
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здорово расписано про все: http://en.cppreference.com/w/cpp/atomic/memory_order на более низком уровне, чем happens-before.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395090
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczsynchronized через ch пишеться, если что."пишется" без ь пишется, если что.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395141
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа что значит дойдёт? что вы под этим подразумеваете?

Что угодно. JMM это список гарантий. Не более. Все попытки придумать "как это делано"- это пустая трата времени (более того, это запутывает). Волатильность гарантирует только две вещи- атомарность и то, что чтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит.
Никаких гарантий, какую запись увидит чтение нет. Вообще никаких. Сброс кэшей и т.п.- это только чьи-то фантазии. Если в JDK 1.8.101 сделано так, то в 1.8.111 может всё быть уже по-другому. Если что-то выпоняется на intel core i7, то на ARM может быть всё другое. А арендовав машину в облаке можно получить что угодно.

questionerкогда второй поток обратится? да в какой бы момент после записи волатильной переменной не обратился, в любой момент и увидит новой значение.

Откуда, ну откуда Вы это взяли? Никто и нигде такого не обещал.

questionerопять же у момента записи есть свойство - время, соответственно, транзитивно верно сказать, что после времени записи волатильной переменной любые потоки увидят это обновление.

Такое обязательство (наличие момента времени для каждой операции) снизило бы производительность многоядерной системы на несколько порядков. Поэтому "у момента записи есть свойство - время" - неправда. Чем быстрее Вы это поймёте- тем быстрее поймёте JMM и вообще разработку в многопроцессорной среде.

Вся JMM построена на понятии частичного порядка. По сути "если мы видим вот эту запись, то мы видим и вот эти операции точно, а вот эти- может быть". Всё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора").
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395152
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> чтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит.
Кто на ком сидел?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395159
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора"
Это большая беда сейчас. Молодёжь не хочет читать формальные спецификации, а полагается на своё "понимание работы процессора".
Говорят, что полезно начинать учиться прогать с ассемблера. Сколько я наблюдал таких начавших — все они были подтверждением того, что НЕ полезно. Пишут код исходя из своего "понимания" работы. И когда видят, что компилятор компилирует во что-то, что не соответствует этому "пониманию", начинают бегать везде и вопить о багах в компиляторах.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора").
То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395191
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. А как по вашему мы должны определять увидели мы изменение или нет? в коде может как-то?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395195
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczCommon LispBlazkowicz, подскажи))
На юг.Зачем?))
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395196
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczAlexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора").
То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода.

Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395215
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlexey TominВсё. Забудьте (до понимания главного) про кэши, инвалидацию, реордеригн, спекулятивное исполнение (да, оно тоже может подгадить тому, кто пытается строить код на "понимании работы процессора").
То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода.

Знать это надо, не надо это пытаться применять в данном случае :)
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395218
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerBlazkowiczпропущено...

То что оно не пригодится на практике, вообще никак не значит что про это нужно забывать. Полезно понимать природу вещей, а не абстрактные аксиомы. Для понимания нужно знать как всё работает. JMM нужна совершенно для другого - она даёт доказательных механизм корректности работы кода.

Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что.

Зависит от процессора. Это главное, что надо знать.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395230
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНет уж давайте конкретно. что значит "дойдёт"?

Значит, что второй поток увидит значение, заданное в другом потоке.
Через сколько тактов процессора второй поток увидит изменения, сделанные первым- точно неизвестно.

questionerПро атомарность это Вы про long и double ?

Да, хотя для intel это не актуально, но может стрельнуть на каком-нибудь ARM.

questionerAlexey Tominчтение видит всё то, что было сделано до (в том же потоке) той записи, которую это чтение видит.
Для видимости внутри одного потока у нас и так есть гарантии(happens before) по JMM. Никакой volatile тут не при делах.

Да, я неудачно выразился.
Если в потоке 1 поменяли значения волательной переменной и в потоке 2 мы это увидели, то мы увидим (во втором потоке) так же все изменения, сделанные в 1м потоке до (внутри одного потока допустимо говорить о порядке) изменения волатильной переменной.
Но надо понимать, что можем увидеть и ЕЩЁ какие-то изменения ;)

questionerAlexey TominОткуда, ну откуда Вы это взяли? Никто и нигде такого не обещал.
А как же ж нет то? давайте посмотрим на любой код, который работает с volatile, а без него не гарантированно.

Не путайте "обычно так" и "гарантировано". В этом и проблема, что код с ошибкой работает в 99.9% случаев. Т.е. у заказчика бага будет, а воспроизвести- фиг.

questionerЭто похоже на side effect volatile. А как по вашему мы должны определять увидели мы изменение или нет? в коде может как-то?

А волатильные переменные и служат флагами.
Мы просто ждём, пока увидим изменения.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395273
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tominquestionerпропущено...


Расскажите пожалуйста про то, что случается при входе в критическую секцию с кешами. Я такого не встречал пока что.

Зависит от процессора. Это главное, что надо знать.

я спросил, что случится, получил ответ, что главное, это надо знать. Что знать то надо?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395283
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395292
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ?
В других случаях я не очень понимаю как мы будем понимать чего нам ждать
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395373
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerтак мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться.

Отсутствие гарантий нельзя проверить. Ещё раз- при любом эксперементе, скорее всего, Вы проблем не увидете. Они вдруг случатся в продакшене.

questionerЗачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем?

И не надо. Есть гарантии JMM - это всё, что надо знать.


questionerну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ?
В других случаях я не очень понимаю как мы будем понимать чего нам ждать

Нет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке.
Но если второй поток это увидел- у нас появляются гарантии.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395403
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        if (instance == null) {
            synchronized (Something.class) {
                if (instance == null)
                    instance = new Something();
            }
        }
        return instance;
    }
    ....
}



внутри synchronized (Something.class) мы же всегда увидим корректное значение?

То есть то, что DCL без volatile не работает это всего лишь то, что нам придётся захватывать лишний раз монитор и выигрыша в производительности(ради чего и придумана была эта идея) мы не получим, но при этом второй экземпляр синглтона создать нам таки не получится? то есть код thread-safe, но просто тормозной. Я просто под сломанностью понимал другое до этого.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395485
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке.
Но если второй поток это увидел- у нас появляются гарантии.
Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях. А то, что и все остальное до записи видно - это как side-эффект.

автор
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        if (instance == null) {
            synchronized (Something.class) {
                if (instance == null)
                    instance = new Something();
            }
        }
        return instance;
    }
    ....
}



В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395505
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все.

Вот и у меня такие мысли, то есть синглтон работает, но, вероятно, не эффективно, но прям в каждой статье об этом столько ненависти к этому коду и что мол это "очевидно" не будет работать)

Вот если ссылка не идиножды меняется, то да, тогда очевидно, что будет бяка.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395518
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892,

хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка. с другой стороны final вроде гарантирует видимость, а volatile только видимость себя самого гарантирует.


я запутался
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395525
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerno56892,

хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка.
Допустим, но volatile жеж гарантирует условно только саму себя...
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395560
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.

Цитату, пожалуйста. Где это написано.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395564
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395570
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКстати по поводу DCL и входа в synchronized секцию:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        if (instance == null) { // point.1
            synchronized (Something.class) {
                if (instance == null)
                    instance = new Something();
            }
        }
        return instance; // point.2
    }
    ....
}


внутри synchronized (Something.class) мы же всегда увидим корректное значение?

Нет.
Поток 1 зашёл, увидел null (в point.1), создал, записал.
Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.
И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое.
Все "доказатильства" вида "да я миллион раз выполнил и всегда не null" ничего не говорят про то, что через год не выйдет новая прошивка процессора и версия jvm, в которых это ВДРУГ не стрельнёт в одном случае из миллиона.
Современные процессоры очень сложны. Как работают все его оптимизации, спекулятивные ветки и т.п. знает очень мало людей и, поверьте, это не Вы и не я.
Поверх идёт ещё (не самый очевидный) оптимизатор jvm. Который тоже понимают, мягко говоря, не все.
Плюс будущие процессоры (включая принципиально новые архитектуры).
Плюс куча компиляторов (C1, C2, ibm'овский, excelsior graal, ищё чего есть и чего БУДЕТ).

Код надо писать по спецификации. Всё остальное- путь сильного духом и слабого умом.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395575
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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" переводится как "автоматически становится видна". Это разные термины.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395578
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395587
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tomin.
Поток 1 зашёл, увидел null (в point.1), создал, записал.
Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.
И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое.


Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом?

Во-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395591
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominПоток 1 зашёл, увидел null (в point.1), создал, записал.
Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.Вы хотите сказать, что в point 2 он может опять "увидеть" null?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395593
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominА теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины.А как можно "увидеть", кроме как прочитав?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395596
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395601
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominno56892Alexey Tomin,

пропущено...

https://docs.oracle.com/javase/8/docs/api/
->java.util.concurrent->Memory Consistency Properties

А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины.

Вы писали:
авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке.
Он ее увидит как только прочитает ее, т.е. сразу. А Вы написали, что если увидит запись в волатайл, то типа увидит и все, что было до нее. Т.е. может и не увидеть. Я же говорил о том, что все чтения видят предыдущие записи с volatile. Вот здесь и нужен фактор времени, который Вы отрицали, как мне показалось. Так как два+ потока не могут одновременно писать/читать в одну ячейку памяти, то кто-то из них по времени физически это сделает раньше. Вот что я хотел сказать.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395607
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}



Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков.

Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395609
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Alexey Tominпропущено...


А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины.

Вы писали:
авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке.
Он ее увидит как только прочитает ее, т.е. сразу.

Нет такого. В спецификации сказано, что он может прочитать любое более старое значение.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395612
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395616
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominno56892пропущено...


Вы писали:
пропущено...

Он ее увидит как только прочитает ее, т.е. сразу.

Нет такого. В спецификации сказано, что он может прочитать любое более старое значение.
Цитату плиз)
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395625
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЯ хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null.Что-то мне кажется, что у вас паранойя.

JMM подробно пока не читал, знаком с C++11 memory model, которая выглядит более мозговывернутой, чем JMM. Так вот, если значение в одном потоке может смениться с null на не-null и другой поток увидел не-null, то старое значение — null — он уже никогда не увидит.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395626
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tomin[

У Вас ниже аргументация ещё более зыбкая - "я думаю"


Вы тоже не приводите обличающих и бесспорных аргументов)


Alexey Tominhappens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before).
В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз.

Ну вот хотелось бы прув на это, я не говорю, что это не так, просто я нигде такого не видел среди прочитанного.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395630
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}



Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков.

Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно.

а в чем разница? какое здесь h-b появляется дополнительно?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395639
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.Во всех доках пишется, что чтения из volatile не оптимизируются (путём кэширования в регистрах), а всегда делаются обращением к памяти, а это несколько другое.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395645
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionersyncronized vs volatile с точки зрения visibility synchronized и volatile - работают в неразрывной связке. Visibility обеспечивается за счет volatile . (точка)
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395651
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanquestionersyncronized vs volatile с точки зрения visibility synchronized и volatile - работают в неразрывной связке. Visibility обеспечивается за счет volatile . (точка)

Запятая. не всегда, чтобы гарантировать видимость нужен volatile.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395654
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще - прежде чем обсуждать поведение "у меня всегда так получается", не худо было бы протестировать (свои) предположения на, как минимум, двухголовой железке.
Вот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395660
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается.

А вот вариант:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}


эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не safe", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395662
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
while (!this.done)
    Thread.sleep(1000);

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 .
теперь точка (:
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395674
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovИ вообще - прежде чем обсуждать поведение "у меня всегда так получается", не худо было бы протестировать (свои) предположения на, как минимум, двухголовой железке.
Вот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками.

а кто обсуждает "у меня всегда так получается" ?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395677
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
while (!this.done)
    Thread.sleep(1000);

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 секции по одному монитору.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395678
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается.

А вот вариант:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}


эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не safe", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только.

А можно для тех, кто в танке разжевать? зачем локальная переменная? какое h-b она добавляет?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395682
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значениеАнрыл.
Подсказка - когерентность кэша .
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395684
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
Оно не добавляет hb, оно решает проблему по которой instance может вернуть сначало не null в if-е, а в return null. То есть тут один раз читаем, и если null - мы заходим в synchronized там hb и все такое, если нет - ее же и возвращаем.

Usman, а как насчет такого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
boolean flag  = false;

//Thread 1:

while(!flag) {
  atomicInteger.get();
}

//Thread 2:

flag = true;
atomicInteger.getAndIncrement();
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395686
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovno56892поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значениеАнрыл.
Подсказка - когерентность кэша .
А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395687
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892
Код: java
1.
atomicInteger

cheat
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395689
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovno56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.Во всех доках пишется, что чтения из volatile не оптимизируются (путём кэширования в регистрах), а всегда делаются обращением к памяти, а это несколько другое.

В каких доках?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395692
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerAlexey TominКстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности:
...
Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно.
а в чем разница? какое здесь h-b появляется дополнительно?

Возможные варианты второго потока.
1. на первой строке из this.instance прочитан не null. Он и вернётся. Другого нет, т.к. у нас локальная переменная, которая не меняется, если прочитали не null.
2. на первой строке null, в синхронном блоке не null - мы внутри синхронного блока, можем читать переменную сколько угодно раз, т.к. вне блока она не меняется.
3. на первой строке null, в синхронном блоке null - тут бага у меня- надо так же instance = this.instance сделать- тогда, мы точно получим нужное значение.
Т.е. на всех трёх ветках будет возвращён не null. Расписывать через hb мне лень.
Что дважды конструктор не вызовется доказывать надо?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395694
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Alexey Tominпропущено...


Нет такого. В спецификации сказано, что он может прочитать любое более старое значение.
Цитату плиз)

Найду. Но не сразу- jmm в оригинале не самое простое чтение, а найти быстро то, где Шипелёв это явно и с выражением говорит- ещё сложнее.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395699
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Basil A. Sidorovпропущено...
Анрыл.
Подсказка - когерентность кэша .
А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд.

"Я не могу придумать, как процессор это сделает"- никак не аргумент.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395700
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А вот вариант:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
               if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}

Чем хуже простое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Нечто{
  private static Нечто экземпляр = null;
  public static Нечто выдатьУникум(){
    if ( экземпляр != null ) return экземпляр;
    synchronized (Нечто.class) {
      if ( экземпляр != null ) return экземпляр;
      экземпляр = new Нечто();
      return экземпляр;
    }
  }
}

?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395702
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominВ каких доках?Собирательно-иносказательно.
Или есть возражения по базовой трактовке директивы volatile?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395704
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
Дважды не вызовется, но вот если конструктор в синглтоне не "safe", например такой:
Код: java
1.
2.
3.
class Singleton {
private int = 10;
}


то зафэйлится (при доступе к полю можем и 0 схватить при условии, что получили объект через "race read"), а так нет:
Код: java
1.
2.
3.
4.
class Singleton {
private final int = 10;
// либо private volatile int = 10;
}
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395709
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Код: java
1.
 if ( экземпляр != null ) return экземпляр;


У вас здесь два чтения, это же как раз выше и обсуждалось, при первом чтении будет объект а при втором может и null.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395710
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд.Получиться что? Несинхронность кэшей двух ядер, между которыми планировщик перебрасывает потоки?
Лично я исхожу из презумпции разумности: код планировщика создавался людьми, которые не только лучше нас разбираются в вопросе, но и могут отлаживаться на весьма экзотических системах.
Это даже если забыть о том, что делают разработчики процессоров.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395711
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominno56892пропущено...

А помоему очень даже риал, в таком случае приведите как такое может получиться на Ваш взгляд.

"Я не могу придумать, как процессор это сделает"- никак не аргумент.
В таком случае покажите как когерентность кэшэй не допустит случая, который я описал.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395714
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЧем хуже простое:
Код: sql
1.
2.
3.
4.
5.
public class Нечто{
  private static Нечто экземпляр = null;
  public static Нечто выдатьУникум(){
    if ( экземпляр != null ) return экземпляр; <---- ну вот же два чтения поля под гонкой.
...


?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395715
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892У вас здесь два чтения, это же как раз выше и обсуждалось, при первом чтении будет объект а при втором может и null.Угу. В нереальном сценарии дубиноголовых разработчиков процессоров и операционных систем.
Нет, я могу представить режим работы процессора, в котором можно получить такой эффект, но я не могу представить систему, работающую в таком режиме.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395716
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAlexey TominВ каких доках?Собирательно-иносказательно.
Или есть возражения по базовой трактовке директивы volatile?

Есть. Она гарантирует hb. Как оно будет обеспечено- вопрос другой.

Надо понимать, что до второго процессора записанное значение всё одно дойдёт нескоро.
Записали. Сказали "сбрось нафиг кэш". Пошла работа- ждём очередь записи, обновляем сквозь все три уровня кэша строчку- это сотни тактов. Сотни!
Кто сказал, что соседний процессор замер в предвкушении? Нет, конечно. Он жуёт свои кэши (инвалиадировать кэшлайн пока данные не в ОЗУ нельзя, а то опять фигня прочитается). Когда запись из первого пройдёт- ему прилетит инвализация строки кэша. Да, тут он остановится и начнёт перечитывать строку кэша. Но "сразу" уже давно прошло
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395718
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Alexey Tomin,
Дважды не вызовется, но вот если конструктор в синглтоне не "safe", например такой:
Код: java
1.
2.
3.
class Singleton {
private int = 10;
}



то зафэйлится

От этого ничего не спасёт. Если прочитаны данные "под гонкой" то они испорчены необратимо.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395721
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
Они никуда не утрачены, ссылка на объект в памяти не изменится.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395726
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Alexey Tominпропущено...
"Я не могу придумать, как процессор это сделает"- никак не аргумент.
В таком случае покажите как когерентность кэшэй не допустит случая, который я описал.

Тут вопрос о чём мы говорим.
"Засыпание и просыпание" не ломает hb - тут есть некоторые гарантии OS (я тоже этот вариант придумал, но на joker'е сказали, что "да без этого и single-thread работать не будет ия согласен).
Другое дело, что искать как сломается работа- это неправильный путь. Гарантий нет- значит может быть что угодна. А как оно может быть- вопрос забавный- очень подходит для разговора под пивко , но к JMM отношения не имеющий.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395730
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominno56892пропущено...

В таком случае покажите как когерентность кэшэй не допустит случая, который я описал.

Тут вопрос о чём мы говорим.
"Засыпание и просыпание" не ломает hb - тут есть некоторые гарантии OS (я тоже этот вариант придумал, но на joker'е сказали, что "да без этого и single-thread работать не будет ия согласен).
Другое дело, что искать как сломается работа- это неправильный путь. Гарантий нет- значит может быть что угодна. А как оно может быть- вопрос забавный- очень подходит для разговора под пивко , но к JMM отношения не имеющий.
Так я же говорю про случай где как раз таки нет happens before. То, что не ломает hb это ясно, вопрос в том, когда его нету. Вполне логично было бы предположить, что чтение происходит из разных кэшэй, а разные кэши - разные ядра. Ну да ладно, меня такой вариант развития событий устраивает для обоснования такого чуда)))
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395735
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892В таком случае покажите как когерентность кэшэй не допустит случая, который я описал.Первоначально линии логических схем могли находится только в двух состояниях и, типично, объединялись по схеме монтажного или.
Затем добавилось третье (высокимпедансное) состояние, в котором отключенная линия не влияла на сигналы, выдаваемые другими линиями.
Затем добавилась возможность чтения уровней шины линией, находящейся в третьем состоянии.

У кэша есть два основных режима работы - сквозная запись (write-through) и отложенная запись (write-back). Режим по умолчанию - сквозная запись, при которой на шину выдаются адреса, по которым идут обращения.
Процессоры (ядра) умеют считывать (snooping) эти адреса и, если режим обращения указывает на запись - процессор (ядро) пометит соответствующую строку в своём кэше как невалидную. Если найдёт, конечно.
Дальше, вроде бы, всё очевидно.
И это я ещё не упомянул ни явные команды инвалидации кэша (i486+) ни всяческих "барьеров памяти" (просто знаю, что есть).
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395736
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanno56892
Код: java
1.
atomicInteger

cheat
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395743
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,
Дак это же наиобычнейший happens-before, там много как его можно заиметь помимо volatile и synchronized. Java SE API -> java.util.concurrent вниз прокрутить справа там все очень емко расписано.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395748
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЕсть. Она гарантирует hb.Это гарантирует JMM. И это - дополнительная гарантия сверх базовой.Как оно будет обеспечено- вопрос другой.Другой. И неважный.Надо понимать, что до второго процессора записанное значение всё одно дойдёт нескоро.Скоро или нескоро влияет только на цену happens-before.
Собственно, процессору совершенно необязательно записать значение в основную память - более чем достаточно начать специальный цикл на шине, "увидев" который "потенциально заинтересованные" "замрут в ожидании".
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395768
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСобственно, процессору совершенно необязательно записать значение в основную память - более чем достаточно начать специальный цикл на шине, "увидев" который "потенциально заинтересованные" "замрут в ожидании".

Всё одно- блокировка не может дойти сразу. Вопрос только в размере задержки.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395772
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominВсё одно- блокировка не может дойти сразу.Не согласен - если блокировка критична, то сначала делаются подготовительные приседания и только потом подаётся основное блюдо.
Т.е. процессор должен сначала оповестить "я меняю этот адрес" и только потом начать записывать новое значение.

P.S. Нет, я, конечно, не знаю как оно в реальности работает ...
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395781
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Дак это же наиобычнейший happens-beforeопять же, который достигается за счет volatile
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395811
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanno56892Дак это же наиобычнейший happens-beforeопять же, который достигается за счет volatile

но без пары с synchronized
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395827
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAlexey TominВсё одно- блокировка не может дойти сразу.Не согласен - если блокировка критична, то сначала делаются подготовительные приседания и только потом подаётся основное блюдо.
Т.е. процессор должен сначала оповестить "я меняю этот адрес" и только потом начать записывать новое значение.

P.S. Нет, я, конечно, не знаю как оно в реальности работает ...

Наверное.
Т.е. возможно, что "сразу после" присвоения volatile-переменной в другом потоке прочитается новое значние.
И я ошибся- оно не может прочитать более старое значение.

Но суть-то не в этом. Не надо сравнивать моменты времени. Это лишнее.
Просто операции с volatile объектами всегда можно выстроить в порядок, причём он одинаковый для всех читателей. Введения понятия времени только запутывает дело. Есть "раньше-позже" для конкретных операций, а время тут лишнее. Я вот запутался в них :)
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395901
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominПошла работа- ждём очередь записи, обновляем сквозь все три уровня кэша строчку- это сотни тактов. Сотни!
Кто сказал, что соседний процессор замер в предвкушении? Нет, конечно. Он жуёт свои кэши (инвалиадировать кэшлайн пока данные не в ОЗУ нельзя, а то опять фигня прочитается). Когда запись из первого пройдёт- ему прилетит инвализация строки кэша. Да, тут он остановится и начнёт перечитывать строку кэша. Но "сразу" уже давно прошло

Ну так говорится же, что сразу после окончания записи данные будут видны всем потокам. После, видимо, всех этих сотен тактов.

Запись длительная операция, возможно даже синхронная (ну как вариант). Противоречий не вижу.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395918
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39395961
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНу так говорится же, что сразу после окончания записи данные будут видны всем потокам. После, видимо, всех этих сотен тактов.
Запись длительная операция, возможно даже синхронная (ну как вариант). Противоречий не вижу.

По сути, вопрос времени только запутывает.
Просто для другого потока "сразу" наступает в какой-то отложенный момент. В какой- вопрос интересный, НО не описанный никак в JMM (я вчера много чего там прочитал).
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396012
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВ вашем примере, да, реордеринг может случиться и другой поток может увидеть нечто вгоняющее в ступор, но это особенность JMM. Я лишь говорю, что время это АТТРИБУТ события(1). любое, любое другое событие после события(1) будет иметь время, большее, чем у события(2), а меньшее, меньше, чем у события(1).
Скорее шкала.
Но дело в том, что если в потоке А произошли события 1 и 2, то в другом потоке они не произошли, а соответственно нет возможности понять какое было раньше какое позже.
Поэтому придумали способ - синхронизацию. В какой-то момент времени поток Б гарантированно узнает, что события 1 и 2 произошли. Поскольку он так же може подглядывать в память доступную потоку А, то и до этого по результатам подглядывания он может догадаться о том какое из событий произошло. Но смотрит он через произвольную нарезку кадров (что-то из того что он считал из памяти актуально, а что-то как лежало в его кеше от начала времен, так и лежит). Поэтому у него инет гарантий до точки синхронизации в его шкале времени в что произошло в соседнем потоке, а что нет.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396030
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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() будет еще одна грань, но она до конструктора). Необходимо, чтобы момент окончания конструктора попал за грань, после которой будет чтение адреса.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396036
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВот чтобы были (хотя бы) два реальных процессора, которые не связаны ничем, кроме общей памяти шины адресов и данных которой разделяются между внешними железками.
И не на TSO архитектуре.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396038
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев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 мы вновь увидим его же. Просто это кажется интуитивно понятным, но вот, к сожалению, не работает.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396050
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКак я понял всё это сводится к тому, что если даже мы увидили не в synchronized секции новое значение,
Не в повторном чтении, а в другом чтении. Там нет гарантии, что если ты увидел адрес объекта, то он полностью создан. Другими словами, если в нем есть некоторое поле, которое программа гарантированно считает не null, ибо конструктор его таким делает, то ты можешь увидеть его null или поле x будет установлено, а поле y еще нет и т.п.
Потому что нужна гарантия на то, что конструктор до чтения ссылки. А для этого нужна гарантия конструктор до записи ссылки.
На x86 все более менее просто. На других архитектурах jvm приходится плясать ужом и операция получается не такой простой.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396058
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевНе в повторном чтении, а в другом чтении.
А в чем разница между терминами?

Сергей АрсеньевТам нет гарантии, что если ты увидел адрес объекта, то он полностью создан. Другими словами, если в нем есть некоторое поле, которое программа гарантированно считает не null, ибо конструктор его таким делает, то ты можешь увидеть его null или поле x будет установлено, а поле y еще нет и т.п.
Потому что нужна гарантия на то, что конструктор до чтения ссылки. А для этого нужна гарантия конструктор до записи ссылки.
На x86 все более менее просто. На других архитектурах jvm приходится плясать ужом и операция получается не такой простой.

Тут по-момему глаголов не хватает. я не понял, что Вы имеете виду.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {      
        if (this.instance == null) {//  AAA
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();               
            }
        }        
        return this.instance ;// BBB
    }
}


Если конкретно, то если в AAA увидели не null, то при повторном чтении в BBB ссылки из this.instance может быть даже null
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39396240
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Common LispAlexey TominЯ хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null.Что-то мне кажется, что у вас паранойя.

JMM подробно пока не читал, знаком с C++11 memory model, которая выглядит более мозговывернутой, чем JMM. Так вот, если значение в одном потоке может смениться с null на не-null и другой поток увидел не-null, то старое значение — null — он уже никогда не увидит.Ладно, я, видимо, не прав. Это гарантируется только для атомиков.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397069
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerСергей АрсеньевНе в повторном чтении, а в другом чтении.
А в чем разница между терминами?

повторное чтение это чтение того же самого еще раз.
А другое это чтение чего-то другого.
Грубо говоря чтение ссылки в цикле и чтение того на что указывает ссылка.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397075
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЕсли конкретно, то если в AAA увидели не null, то при повторном чтении в BBB ссылки из this.instance может быть даже null
Ну типа ААА выполнялось на процессоре 1, потом бац перелетели на процессор 2, кеш никто не сбросил и опана мы в BBB с null в кеше?
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397078
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот то, что BBB вернет ссылку на объект все конструкторы которого не отработали до конца это вполне.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397183
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытался продраться сквозь топик (звездные войны уже начались)... ;-)
что может быть полезно новичкам практически по поводу подлянок с 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.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397214
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397382
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевuid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется
я старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии. Большинству мало интересны ньансы JSR 133 (есть только не разрабатывает JDK) а готовые решения и паттерны для новичков необходимы сразу.

Для практического применения удобно использовать связанные локи на чтение и на запись, к примеру ReentrantLock
Можно взять лок на чтение, на запись, взять лок одним потоком а другим потокам дать проскочить. Все просто, понятно и достаточно быстро, не настолько дубово (неэффективно) как synchronized или примитивно как volatile (не всегда к месту).
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397388
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid uniqueк примеру ReentrantLock

пардон другая ссылочка: ReentrantReadWriteLock
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397409
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid uniqueя старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии.
Ну я тоже передернул. Согласованного в том смысле, что если он увидит запись, то он увидит и те записи (включая другие переменные), которые были до того, если больше они ничем не перезаписывались.

А кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397430
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевА кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня.
Лучшие друзья дев... пардон программистов в потоках это dead lock-и. И низкая производительность от избыточного локирования ресурсов. synchronized ни в коем случае не плохая вещь, просто ссылку дал на ReentrantReadWriteLock может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397438
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда.
Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :)
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397514
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевuid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда.
Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :)

Можно все типовое руками написать (раньше так и было но JDK 5 дело пошло веселее) только скорее всего это уже есть в jdk и лучше время потратить на бизнес логику в своем проекте. Отладка низкоуровневых суповых наборов дело непростое - ковырнешь в одном месте, в другом отвалится, полного покрытия тестами как правило не бывает под многопоточность и вылезет проблема под высокой нагрузкой уже в продакшн (к примеру), пусть даже не в нем а недалеко от него, все равно плохо будет. И отлаживать нелегко, поэтому лучше писать так чтобы новичок с ходу понимал.

Eще одна полезняшка из высокоуровневых интерфейсов - Condition .
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39397776
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВот тут очень долго это все обсуждали, в итоге пришли к тому, что ситуация когда поток так и не увидит запись волатильной переменной другого потока НЕ ПРОТИВОРЕЧИТ JMM.
Но это сильно специфично надо трактовать
jsr-133A write to a volatile field happens-before every subsequent read of that volatile
Где говорится, что запись в volatile находится в отношении "была до" любого последующего чтения. Причем это явно не про один и тот же поток.
...
Рейтинг: 0 / 0
syncronized vs volatile с точки зрения visibility
    #39398978
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается.

А вот вариант:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Something {
    private static Something instance = null;
    public static Something getInstance() {
        Something instance = this.instance; // это позволяет читать под гонкой ровно один раз.
        if (instance == null) {
            synchronized (Something.class) {
                if (this.instance == null)
                    this.instance = new Something();
                else
                    instance = this.instance; // А это чтение h-b, так как синхронизировано.
            }
        }
        return instance;
    }
}


эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не 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.
class Foo{
    private final Map map;
     Foo(){
         map = new HashMap();
         map.put(1,"object");
     }

     public void bar(){
       System.out.println(map.get(1));
     }
}



в книге приведен в точности до имен пример как пример безопасной публикации.

Наконец-то разобрался)
...
Рейтинг: 0 / 0
135 сообщений из 135, показаны все 6 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / syncronized vs volatile с точки зрения visibility
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]