powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / syncronized vs volatile с точки зрения visibility
10 сообщений из 135, страница 6 из 6
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
10 сообщений из 135, страница 6 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / syncronized vs volatile с точки зрения visibility
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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