powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Reordering
25 сообщений из 83, страница 1 из 4
Reordering
    #38524479
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такой код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    //first thread  
    reslit = calc();  
    reslitReady = true;
      
    //second thread  
    if (reslitReady){  
        takeDesision(reslit);  
    }  



в первом потоке может случится реордеринг и второй поток словит NPE. Как сделать, чтобы первый поток всегда выполнял строку
Код: plaintext
reslitReady = true
после строки
Код: plaintext
reslit = calc();
? В противном случае от NPE во втором потоке никто не гарантирует.
...
Рейтинг: 0 / 0
Reordering
    #38524496
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
reslitReady = reslit != null 
...
Рейтинг: 0 / 0
Reordering
    #38524510
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагман
Код: java
1.
reslitReady = reslit != null 



И?
Сначала выполнится reslitReady = reslit != null, потом reslit = calc(); и второй поток будет вечно ждать.
...
Рейтинг: 0 / 0
Reordering
    #38524518
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volatile?
...
Рейтинг: 0 / 0
Reordering
    #38524522
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczvolatile?

Каким образом volatile спасет от reordering?
...
Рейтинг: 0 / 0
Reordering
    #38524526
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zu,

реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.
...
Рейтинг: 0 / 0
Reordering
    #38524532
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот пост раскручиваете? http://www.javaspecialist.ru/2011/06/java-memory-model.html
...
Рейтинг: 0 / 0
Reordering
    #38524534
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагманzig zu,

реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.

Согласен, так наверное будет работать.

Давайте тогда усложним задачу ))

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 //first thread  
    calc();  
    reslitReady = true;
      
    //second thread  
    if (reslitReady){  
        takeDesision();  
    } 
...
Рейтинг: 0 / 0
Reordering
    #38524536
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuBlazkowiczvolatile?

Каким образом volatile спасет от reordering?
Если ты пришёл в форум за вопросом - то должен
соблюдать протокол. Тебе задали вопрос - ответь на него.
Если ты сам задаёшь вопросы - то сообщество решит
что ты слишком умён и тебе помогать не стоит.
...
Рейтинг: 0 / 0
Reordering
    #38524539
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛагманЭтот пост раскручиваете? http://www.javaspecialist.ru/2011/06/java-memory-model.html

Нет, я его прочитал и не понял момент про который спрашиваю.
...
Рейтинг: 0 / 0
Reordering
    #38524542
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь calc() в экспшен засунуть
...
Рейтинг: 0 / 0
Reordering
    #38524553
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, т.е. в try-catch
...
Рейтинг: 0 / 0
Reordering
    #38524558
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагманну, т.е. в try-catch

в этом случае тоже реордеринга не будет? ну то есть если calc будет в try-catch а после этой конструкции установвка флага?
...
Рейтинг: 0 / 0
Reordering
    #38524569
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zu,

На самом деле я не знаю, может гуру многопоточности подскажут
...
Рейтинг: 0 / 0
Reordering
    #38524630
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманЭтот пост раскручиваете? http://www.javaspecialist.ru/2011/06/java-memory-model.html
Кстати, там же есть ссылка https://blogs.oracle.com/vmrobot/entry/модель_памяти_java , которая и является первоисточником всех статей выше, с изменененными примерами и прочей водой.

zig zuBlazkowiczvolatile?

Каким образом volatile спасет от reordering?

"... и на мой взгляд у этих правил есть только одно следствие, касающееся порядка операций, используемое на практике: операции чтения и записи volatile переменных не могут быть переупорядочены с операциями чтения и записи других volatile и не-volatile переменных. Это следствие делает возможным использование volatile переменной как флага, сигнализирующем об окончании какого-либо действия, например: ...".

Так что подойдет для двух случаев.
...
Рейтинг: 0 / 0
Reordering
    #38524670
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман
Код: java
1.
reslitReady = reslit != null

Это не работает. Во-первых, это не защищает от реордеринга, так как те же спекулятивные чтения никто не отменял. Во-вторых, потому что если бы вы даже смогли таким образом предовтратить реордеринг, у вас все равно не будет гарантий того, что другой поток увидит изменения именно в таком порядке. Погуглите про store buffer и invalidate queue.
...
Рейтинг: 0 / 0
Reordering
    #38524675
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагманzig zu,
реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.К сожалению, это не так. Out-of-order execution это значительно более сложная вещь, чем "раз зависимы, значит не зареордерятся".
...
Рейтинг: 0 / 0
Reordering
    #38524677
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD,

Отлично! volatile спасет мир.
...
Рейтинг: 0 / 0
Reordering
    #38524684
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuесть такой код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    //first thread  
    reslit = calc();  
    reslitReady = true;
      
    //second thread  
    if (reslitReady){  
        takeDesision(reslit);  
    }  



в первом потоке может случится реордеринг и второй поток словит NPE. Как сделать, чтобы первый поток всегда выполнял строку
Код: plaintext
reslitReady = true
после строки
Код: plaintext
reslit = calc();
? В противном случае от NPE во втором потоке никто не гарантирует.Вам нужен synchronized-with между запись в reslitReady, и чтением из него. Есть множество вариантов, как сделать это.
1) Самый простой - объявить reslitReady volatile.
2) Можно обернуть эти два участка кода в synchronized на одном и том же мониторе.
3) Ну и всевозможные способы, производные от первых двух.
...
Рейтинг: 0 / 0
Reordering
    #38524699
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, мужики, потерпите, ждать осталось не долго - скоро будет готова моя первая часть тренинга по multithreading. В эту часть войдет вся теория по JMM, synchronized, volatile, final, а так же вопросы остановки потоков. Вчера как раз весь день рисовал схемки, как кэши работают :-)
Можете уже бронировать места
...
Рейтинг: 0 / 0
Reordering
    #38524721
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvВообще, мужики, потерпите, ждать осталось не долго - скоро будет готова моя первая часть тренинга по multithreading. В эту часть войдет вся теория по JMM, synchronized, volatile, final, а так же вопросы остановки потоков. Вчера как раз весь день рисовал схемки, как кэши работают :-)
Можете уже бронировать места

Тренинг будет выглядеть так: "Погуглите про ... " ?
...
Рейтинг: 0 / 0
Reordering
    #38524742
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvЛагманzig zu,
реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.К сожалению, это не так. Out-of-order execution это значительно более сложная вещь, чем "раз зависимы, значит не зареордерятся".

Наверное Out-of-order execution действительно крутая и очень сложная штука, но не могли бы вы на пальцах объяснить, как вот такой код может подвергнутся реордеренгу?

Код: java
1.
2.
reslit = calc();
reslitReady = reslit != null  



с учетом того, что основное правило реордеренга гласит - после реордеринга поведение программы не должно меняться.
...
Рейтинг: 0 / 0
Reordering
    #38524751
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuс учетом того, что основное правило реордеренга гласит - после реордеринга поведение программы не должно меняться.
Вероятно имеется ввиду, не то что могут поменять местами строки Java кода. А более мелкие операции уровня как байт-кода так и нативного после JIT компиляции.
...
Рейтинг: 0 / 0
Reordering
    #38524777
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuНаверное Out-of-order execution действительно крутая и очень сложная штука, но не могли бы вы на пальцах объяснить, как вот такой код может подвергнутся реордеренгу?Например, speculative branch prediction. Как это может произойти:
1) Процессор начинает выполнять calc(), и натыкается там на чтение значения, которого нет в кэшах.
2) Из-за этого процессор вынужден отправить запрос в память на получение этого значения; длительность этого чтения может составлять сотни тактов.
3) Что бы не стоять эти такты без дела, процессор начинает фигачить следующие инструкции (пошел out-of-order execution);
4) Процессор натыкается "reslitReady = reslit != null"
5) Вроде бы дело дрянь, так и так придется ждать окончание долго чтения в calc(). Но процессор находит выход: он делает спекулятивное предположение, что, например, reslit != null в будущем будет true, и присваивает reslitReady = true.
6) Далее, если у вас есть что-то вроде "if (reslitReady) { ... }", процессор попытается спекулятивно выполнить какие-то инструкции из этого бранча.
7) Наконец, нам приходит ответ на чтение. Если процессор угадал результат - все круто, идем дальше. Если не угадал - откатываемся.
...
Рейтинг: 0 / 0
Reordering
    #38524790
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv,

а вот в тот момент, когда процессор начал заниматься предсказаниями и выполнил одно из них "присваивает reslitReady = true", это вот предсказанное значение уже может увидеть второй поток?
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Reordering
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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