|
|
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerтак мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться. Отсутствие гарантий нельзя проверить. Ещё раз- при любом эксперементе, скорее всего, Вы проблем не увидете. Они вдруг случатся в продакшене. questionerЗачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем? И не надо. Есть гарантии JMM - это всё, что надо знать. questionerну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ? В других случаях я не очень понимаю как мы будем понимать чего нам ждать Нет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 12:51 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerтак мы можем долго разбираться, давайте Вы приведете пример с volatile, где мы увидим, что изменение не гарантировано и обсудим действительно ли оно не гарантировано. И как этот флаг будет использоваться. Отсутствие гарантий нельзя проверить. Ещё раз- при любом эксперементе, скорее всего, Вы проблем не увидете. Они вдруг случатся в продакшене. questionerЗачем мне, разработчику на java, задумываться о тактах процессора? сброс кешей хоть упрощает понимание происходящего, а такты то мне зачем? И не надо. Есть гарантии JMM - это всё, что надо знать. questionerну и значит ли Ваша фраза про флаги, что есть смысл только в boolean volatile ? В других случаях я не очень понимаю как мы будем понимать чего нам ждать Нет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. Я понимаю, что эксперимент приведет к провалу, но давайте таки посмотрим на код и умозрительно оценим с точки зрения наших знаний и HB. Без конкретики тяжело говорить. ---------------------------------------------- Кстати по поводу DCL и входа в synchronized секцию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. внутри synchronized (Something.class) мы же всегда увидим корректное значение? То есть то, что DCL без volatile не работает это всего лишь то, что нам придётся захватывать лишний раз монитор и выигрыша в производительности(ради чего и придумана была эта идея) мы не получим, но при этом второй экземпляр синглтона создать нам таки не получится? то есть код thread-safe, но просто тормозной. Я просто под сломанностью понимал другое до этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 13:08 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
авторНет, не значит. Это значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Но если второй поток это увидел- у нас появляются гарантии. Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях. А то, что и все остальное до записи видно - это как side-эффект. автор Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:14 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892В данном случае все ОК, за исключением того, что в случае с volatile некоторые потоки, могли бы увидеть ссылку уже в первой строке, а здесь вынуждены будут заходить в synchronized. Хотя я читал, что без volatile это не работает типо, я так и не увидел никаких доводов - то, что instance не синхронизирована - ну будет null во втором потоке, когда уже в памяти не null, ну зайдем в synchronized и все. Вот и у меня такие мысли, то есть синглтон работает, но, вероятно, не эффективно, но прям в каждой статье об этом столько ненависти к этому коду и что мол это "очевидно" не будет работать) Вот если ссылка не идиножды меняется, то да, тогда очевидно, что будет бяка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:34 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892, хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка. с другой стороны final вроде гарантирует видимость, а volatile только видимость себя самого гарантирует. я запутался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:44 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerno56892, хотя вроде как всё-таки нет гарантий, что если мы увидели не null ссылку вне synchronized, то мы увидим все поля, объекта, на который указывает эта ссылка. Допустим, но volatile жеж гарантирует условно только саму себя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях. Цитату, пожалуйста. Где это написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:31 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:34 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerКстати по поводу DCL и входа в synchronized секцию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. внутри synchronized (Something.class) мы же всегда увидим корректное значение? Нет. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Все "доказатильства" вида "да я миллион раз выполнил и всегда не null" ничего не говорят про то, что через год не выйдет новая прошивка процессора и версия jvm, в которых это ВДРУГ не стрельнёт в одном случае из миллиона. Современные процессоры очень сложны. Как работают все его оптимизации, спекулятивные ветки и т.п. знает очень мало людей и, поверьте, это не Вы и не я. Поверх идёт ещё (не самый очевидный) оптимизатор jvm. Который тоже понимают, мягко говоря, не все. Плюс будущие процессоры (включая принципиально новые архитектуры). Плюс куча компиляторов (C1, C2, ibm'овский, excelsior graal, ищё чего есть и чего БУДЕТ). Код надо писать по спецификации. Всё остальное- путь сильного духом и слабого умом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:39 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:42 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tomin, авторA write to a volatile field happens-before every subsequent read of that same field. https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties Точнее даже так. Тут написано, что ЕСЛИ случился subsequent read ТО будет happens-before. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:45 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? Во-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominПоток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.Вы хотите сказать, что в point 2 он может опять "увидеть" null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:52 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominА теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины.А как можно "увидеть", кроме как прочитав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:53 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
questionerAlexey Tomin. Поток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано. И не надо спрашивать "почему". Ответ всё одно будет- никто не даёт никаких гарантий, что в point.2 будет прочитано непустое значение, даже если в point.1 было именно непустое. Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? У Вас ниже аргументация ещё более зыбкая - "я думаю" questionerВо-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу happens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:55 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892Alexey Tomin, пропущено... https://docs.oracle.com/javase/8/docs/api/ ->java.util.concurrent->Memory Consistency Properties А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. Вы писали: авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Он ее увидит как только прочитает ее, т.е. сразу. А Вы написали, что если увидит запись в волатайл, то типа увидит и все, что было до нее. Т.е. может и не увидеть. Я же говорил о том, что все чтения видят предыдущие записи с volatile. Вот здесь и нужен фактор времени, который Вы отрицали, как мне показалось. Так как два+ потока не могут одновременно писать/читать в одну ячейку памяти, то кто-то из них по времени физически это сделает раньше. Вот что я хотел сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 15:58 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Common LispAlexey TominПоток 1 зашёл, увидел null (в point.1), создал, записал. Поток в зашёл, увидел не null (в point.1), а вот что он увидет во point.2- вилами на воде писано.Вы хотите сказать, что в point 2 он может опять "увидеть" null? Я хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null. Кстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков. Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:01 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Alexey Tominпропущено... А теперь покажите мне, где "happens-before" переводится как "автоматически становится видна". Это разные термины. Вы писали: авторЭто значит, что мы не можем знать, как скоро второй поток увидет изменения переменной в первом потоке. Он ее увидит как только прочитает ее, т.е. сразу. Нет такого. В спецификации сказано, что он может прочитать любое более старое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:02 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominquestionerпропущено... Во-первых тыкните пальцем в того, кто Вам в этом топике доказывает таким образом? У Вас ниже аргументация ещё более зыбкая - "я думаю" questionerВо-вторых я думаю, что если в point.1 мы увидели, что если в point.1 переменная неинициализирована, то и в point.2 она должна быть видна ибо это ведь happens before в рамках одного потока. Но как доказаться правоту чьей-то точки зрения я ума не приложу happens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. А какая разница? Допустим синглтон объект вообще без полей (конструктор пустой), т.е. в ссылке может быть ЛИБО null ЛИБО ссылка на готовый объект, при каких обстоятельствах чтение instance будет не null, а return null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:03 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tominno56892пропущено... Вы писали: пропущено... Он ее увидит как только прочитает ее, т.е. сразу. Нет такого. В спецификации сказано, что он может прочитать любое более старое значение. Цитату плиз) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:05 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominЯ хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null.Что-то мне кажется, что у вас паранойя. JMM подробно пока не читал, знаком с C++11 memory model, которая выглядит более мозговывернутой, чем JMM. Так вот, если значение в одном потоке может смениться с null на не-null и другой поток увидел не-null, то старое значение — null — он уже никогда не увидит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:10 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin[ У Вас ниже аргументация ещё более зыбкая - "я думаю" Вы тоже не приводите обличающих и бесспорных аргументов) Alexey Tominhappens before не связывает два ЧТЕНИЯ переменных. Она может связать только ЗАПИСЬ и "последующее" чтение (оно становится последующим, только если есть happens before). В данном примере ни первое ни второе чтение instance в потоке 2 не связано "happens before" с записью в потоке 1 (для этого надо либо переменную объявить волатильной, либо чтение делать в синхронной сессии). Т.е. оба чтения идут "под гонкой". А значит может случится конфуз. Ну вот хотелось бы прув на это, я не говорю, что это не так, просто я нигде такого не видел среди прочитанного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:10 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Alexey TominCommon Lispпропущено... Вы хотите сказать, что в point 2 он может опять "увидеть" null? Я хочу сказать, что НИГДЕ нет гарантий, что в точке 2 будет снова прочитан не null. Кстати, на последнем joker'е Шипелёв предложил забавное изменение кода, которое позволяет обойтись без волатильности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но я не возьмусь утверждать, что не ошибся. Требуется вдумчивый анализ всех вариантов исполнения двух потоков. Ну и масса примеров успешных гонок в java.util.concurrent. Только код там- убиться можно. а в чем разница? какое здесь h-b появляется дополнительно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:15 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Это в доках написано черным по белому - то, что запись в volatile автоматически становится видна во всех последующих чтениях.Во всех доках пишется, что чтения из volatile не оптимизируются (путём кэширования в регистрах), а всегда делаются обращением к памяти, а это несколько другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:22 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39395518&tid=2123178]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 194ms |
| total: | 348ms |

| 0 / 0 |
