|
|
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Пытался продраться сквозь топик (звездные войны уже начались)... ;-) что может быть полезно новичкам практически по поводу подлянок с volatile: у volatile разница с atomic в том что чтение и запись в volatile переменную является atomic операцией. volatile int varOne; varOne = 5; int x = varOne; Но есть ньюанс - комбинация операций чтения и записи над volatile переменной не являются atomic. varOne = varOne + 1; или varOne++; Во втором случае разные потоки могут поменять значение varOne в произвольный момент, те если varOne = 5 то не гарантируется varOne++ равный 6 (может быть изменен другим потом в процессе вычисления ++ так как это не одна операция а чтение и запись). Смотрим документацию по synchronized : Each action in a thread happens-before every action in that thread that comes later in the program's order. An unlock (synchronized block or method exit) of a monitor happens-before every subsequent lock (synchronized block or method entry) of that same monitor. And because the happens-before relation is transitive, all actions of a thread prior to unlocking happen-before all actions subsequent to any thread locking that monitor . A write to a volatile field happens-before every subsequent read of that same field. Writes and reads of volatile fields have similar memory consistency effects as entering and exiting monitors, but do not entail mutual exclusion locking. A call to start on a thread happens-before any action in the started thread. All actions in a thread happen-before any other thread successfully returns from a join on that thread. На первый взгляд, видимость (новое значение переменных) гарантируется только для потоков ждущих тот же самый лок, на котором был synchronized block. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 13:09 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 13:50 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевuid uniqueНа первый взгляд, согласованная видимость (новое значение переменных) гарантируется я старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии. Большинству мало интересны ньансы JSR 133 (есть только не разрабатывает JDK) а готовые решения и паттерны для новичков необходимы сразу. Для практического применения удобно использовать связанные локи на чтение и на запись, к примеру ReentrantLock Можно взять лок на чтение, на запись, взять лок одним потоком а другим потокам дать проскочить. Все просто, понятно и достаточно быстро, не настолько дубово (неэффективно) как synchronized или примитивно как volatile (не всегда к месту). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:05 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:08 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid uniqueя старый солдат и не знаю слов любви ;-) пусть будет согласованная видимость, честно сказатъ слаб в терминологии. Ну я тоже передернул. Согласованного в том смысле, что если он увидит запись, то он увидит и те записи (включая другие переменные), которые были до того, если больше они ничем не перезаписывались. А кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:21 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА кто дубовей и кто ведет себя как-то необычно при разных условиях использования в сравнении ReentrantLock и synchronized это отдельная песня. Лучшие друзья дев... пардон программистов в потоках это dead lock-и. И низкая производительность от избыточного локирования ресурсов. synchronized ни в коем случае не плохая вещь, просто ссылку дал на ReentrantReadWriteLock может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:40 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
uid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 16:49 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевuid unique может кому пригодится для разделения локов на запись и чтение (это типовая задача), заглянет и применит этот конструкт вместо изобретения своего велосипеда. Ну это один из класса задач, для него да. Хотя некоторые делают спинами на Atomic и не парятся. :) Можно все типовое руками написать (раньше так и было но JDK 5 дело пошло веселее) только скорее всего это уже есть в jdk и лучше время потратить на бизнес логику в своем проекте. Отладка низкоуровневых суповых наборов дело непростое - ковырнешь в одном месте, в другом отвалится, полного покрытия тестами как правило не бывает под многопоточность и вылезет проблема под высокой нагрузкой уже в продакшн (к примеру), пусть даже не в нем а недалеко от него, все равно плохо будет. И отлаживать нелегко, поэтому лучше писать так чтобы новичок с ходу понимал. Eще одна полезняшка из высокоуровневых интерфейсов - Condition . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 18:22 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
забыл никВот тут очень долго это все обсуждали, в итоге пришли к тому, что ситуация когда поток так и не увидит запись волатильной переменной другого потока НЕ ПРОТИВОРЕЧИТ JMM. Но это сильно специфично надо трактовать jsr-133A write to a volatile field happens-before every subsequent read of that volatile Где говорится, что запись в volatile находится в отношении "была до" любого последующего чтения. Причем это явно не про один и тот же поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 09:06 |
|
||
|
syncronized vs volatile с точки зрения visibility
|
|||
|---|---|---|---|
|
#18+
no56892Кстати я так подумал, а действительно может сначало не null вернуть, а затем return null. Например, вот так: поток проверяет instance == null и это false (ну каким то чудом в кэше этого ядра оказалось достоверное значение), затем саспендится и планировщиком перекидывается на другое ядро, в чьем кэше старое значение, т.е. null, а так как это обычное чтение без синхронизации, то оно и возвращается. А вот вариант: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. эту проблему решает без волатайл. Кстати, тут еще одна штука зачем нужен волатайл - если конструктор у Синглтона "не safe", то это делает возможным получение ссылки на не доконца инициализированный объект, код Выше эту проблему тоже не решает. Так что вот реально, вроде дошло)) Правда у меня еще есть как-бы все говорят про перестановки и т.д., дак что мешает компилятору выкинуть эту локальную переменную вообще? Или так не делается? Вот этот момент не понятен остался только. Думаю правда, но не это главная проблема DCL. Нашёл ответ в concurrency in practice: concurency in practisethe real problem with DCL is the assumption that the worst thing that can happen when reading the shared object reference without synchronization is to erroneously see a stale value (in this case, null); in that cse the DCL idiom compensates for this risk by trying again with the lock held. But the worst case is actually considerably wrong - it is possible to see a current value of the reference but stale values for the object's states, meaning that the object could be seen to be in an invalid or incorrect state. В итоге получаем, что если на момент публикации volatile переменной в объекте были выставлены поля, то мы как минимум на этот момент их увидим. Но если мы сначала присвоили volatile, а потом начали менять состояние объекта, на который указывает ссылка( выставлять поля), то гарантий нет. Что же касается final, то как я и думал магический freeze action всё сделает за нас. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. в книге приведен в точности до имен пример как пример безопасной публикации. Наконец-то разобрался) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2017, 22:55 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39397514&tid=2123178]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
95ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 443ms |

| 0 / 0 |
