2017-02-23 83 views
0

Этот вопрос касается JMM: https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdfТонкие моменты в Случается-До отношения

Не могли бы вы объяснить следующее выражение из JMM спецификации (это раздел 5 на странице 13):

Более конкретно , если два действия разделяют связь между событиями-до, , они не обязательно должны появляться в этом порядке любому коду, с которым они не делятся, до . Пишет в одном потоке, который находится в гонке данных с считанными в другом потоке, может, например, появляться не по порядку до этих чтений.

Если возможно, просьба указать следы выполнения, которые отражают эту проблему.

ответ

0

В параграфе, предшествующем приведенному вами параграфу, указано, что тот факт, что действие a находится в отношениях между событиями и действием b, не означает, что a действительно выполняется до b. Например, в фрагменте кода

x = 10; 
y = 20; 

два действия записи находятся в случается-до отношения, потому что они происходят в том же потоке. Тем не менее, они могут быть фактически заменены (компилятором, JVM или даже процессором), потому что эта замена не может наблюдаться из самой нити.

Однако его можно наблюдать в другом потоке (и это особенно допускается моделью памяти Java). Таким образом, другой поток, который считывает эти две переменные без какой-либо формы синхронизации, может наблюдать, что y изменяется до 20 до того, как x изменится на 10. (Отсутствие синхронизации гарантирует, что запись находится в гонке данных с чтением в другой нить.)