Правильно ли я понимаю, что если я запускаю run1() и run2() параллельно, то результат r1 == 0 и r2 == 0 невозможен при любых обстоятельствах, даже если a и b не являются энергозависимыми?
Код: Выделить всё
public class Example {
private int a = 0;
private int b = 0;
public void run1() {
b = 1; // (1)
int r2 = a; // (2)
}
public void run2() {
a = 2; // (3)
int r1 = b; // (4)
}
}
Мой вывод основан на этом утверждении из модели памяти Java, стр. 17.4.5: «Если x и y — действия одного и того же потока и x стоит перед y в порядке программы, то hb(x, y)».
- (1) и (2) — действия одного и того же потока, и (1) стоит перед (2) в порядке программы. Следовательно, (1) происходит раньше (2).
- Аналогично (3) происходит раньше (4).
Эта программа содержит всего четыре действия, что дает 4! возможных выполнения. Анализируя каждое возможное выполнение, я пришел к выводу, что любое выполнение, ведущее к r1 == 0 и r2 == 0, нарушит описанные выше отношения «происходит до», и поэтому является незаконным.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... va-program