|
|
|
Reordering
|
|||
|---|---|---|---|
|
#18+
есть такой код Код: java 1. 2. 3. 4. 5. 6. 7. 8. в первом потоке может случится реордеринг и второй поток словит NPE. Как сделать, чтобы первый поток всегда выполнял строку Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:20 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:26 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Лагман Код: java 1. И? Сначала выполнится reslitReady = reslit != null, потом reslit = calc(); и второй поток будет вечно ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:30 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Blazkowiczvolatile? Каким образом volatile спасет от reordering? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:33 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
zig zu, реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:34 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Этот пост раскручиваете? http://www.javaspecialist.ru/2011/06/java-memory-model.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:37 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Лагманzig zu, реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет. Согласен, так наверное будет работать. Давайте тогда усложним задачу )) Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:38 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
zig zuBlazkowiczvolatile? Каким образом volatile спасет от reordering? Если ты пришёл в форум за вопросом - то должен соблюдать протокол. Тебе задали вопрос - ответь на него. Если ты сам задаёшь вопросы - то сообщество решит что ты слишком умён и тебе помогать не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:39 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
ЛагманЭтот пост раскручиваете? http://www.javaspecialist.ru/2011/06/java-memory-model.html Нет, я его прочитал и не понял момент про который спрашиваю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:39 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Теперь calc() в экспшен засунуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:39 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Лагманну, т.е. в try-catch в этом случае тоже реордеринга не будет? ну то есть если calc будет в try-catch а после этой конструкции установвка флага? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:45 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
zig zu, На самом деле я не знаю, может гуру многопоточности подскажут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 15:49 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
ЛагманЭтот пост раскручиваете? 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 переменной как флага, сигнализирующем об окончании какого-либо действия, например: ...". Так что подойдет для двух случаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:11 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Лагман Код: java 1. Это не работает. Во-первых, это не защищает от реордеринга, так как те же спекулятивные чтения никто не отменял. Во-вторых, потому что если бы вы даже смогли таким образом предовтратить реордеринг, у вас все равно не будет гарантий того, что другой поток увидит изменения именно в таком порядке. Погуглите про store buffer и invalidate queue. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:29 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Лагманzig zu, реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.К сожалению, это не так. Out-of-order execution это значительно более сложная вещь, чем "раз зависимы, значит не зареордерятся". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:30 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
0FD, Отлично! volatile спасет мир. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:31 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
zig zuесть такой код Код: java 1. 2. 3. 4. 5. 6. 7. 8. в первом потоке может случится реордеринг и второй поток словит NPE. Как сделать, чтобы первый поток всегда выполнял строку Код: plaintext Код: plaintext 1) Самый простой - объявить reslitReady volatile. 2) Можно обернуть эти два участка кода в synchronized на одном и том же мониторе. 3) Ну и всевозможные способы, производные от первых двух. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:33 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
Вообще, мужики, потерпите, ждать осталось не долго - скоро будет готова моя первая часть тренинга по multithreading. В эту часть войдет вся теория по JMM, synchronized, volatile, final, а так же вопросы остановки потоков. Вчера как раз весь день рисовал схемки, как кэши работают :-) Можете уже бронировать места ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:38 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
cdtyjvВообще, мужики, потерпите, ждать осталось не долго - скоро будет готова моя первая часть тренинга по multithreading. В эту часть войдет вся теория по JMM, synchronized, volatile, final, а так же вопросы остановки потоков. Вчера как раз весь день рисовал схемки, как кэши работают :-) Можете уже бронировать места Тренинг будет выглядеть так: "Погуглите про ... " ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:47 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
cdtyjvЛагманzig zu, реордеринг возможен, если инструкции независимы друг от друга. Если мы пишем reslit != null то это уже зависит от reslit, и реордеринга не будет.К сожалению, это не так. Out-of-order execution это значительно более сложная вещь, чем "раз зависимы, значит не зареордерятся". Наверное Out-of-order execution действительно крутая и очень сложная штука, но не могли бы вы на пальцах объяснить, как вот такой код может подвергнутся реордеренгу? Код: java 1. 2. с учетом того, что основное правило реордеренга гласит - после реордеринга поведение программы не должно меняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:57 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
zig zuс учетом того, что основное правило реордеренга гласит - после реордеринга поведение программы не должно меняться. Вероятно имеется ввиду, не то что могут поменять местами строки Java кода. А более мелкие операции уровня как байт-кода так и нативного после JIT компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 16:59 |
|
||
|
Reordering
|
|||
|---|---|---|---|
|
#18+
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) Наконец, нам приходит ответ на чтение. Если процессор угадал результат - все круто, идем дальше. Если не угадал - откатываемся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2014, 17:15 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38524777&tid=2127580]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 401ms |

| 0 / 0 |
