Я хотел бы уточнить, как это происходит - прежде чем отношение будет работать с изменчивыми переменными. Пусть мы имеем следующие переменные:
public static int i, iDst, vDst;
public static volatile int v;
и поток A:
i = 1;
v = 2;
и поток B:
vDst = v;
iDst = i;
Являются ли следующие утверждения правильными в соответствии с моделью памяти Java (JMM)? Если нет, то какая будет правильная интерпретация?
-
i = 1
всегда бывает - доv = 2
-
v = 2
происходит доvDst = v
в JMM только в том случае, если это действительно происходит до времени -
i = 1
происходит доiDst = i
в JMM (иiDst
будет предсказуемо назначено1
), еслиv = 2
действительно произойдет доvDst = v
во времени - В противном случае порядок между
i = 1
иiDst = i
равен undefined, а итоговое значениеiDst
равно undefined, а
Ошибка в логике:
В JMM нет концепции "настенных часов", и мы должны полагаться на порядок синхронизации в качестве руководства по заказу для v = 2
и vDst = v
. Подробнее см. В выбранном ответе.