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


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