Я хотел бы уточнить, как это происходит - прежде чем отношение будет работать с изменчивыми переменными. Пусть мы имеем следующие переменные:
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. Подробнее см. В выбранном ответе.