Модель памяти Java гласит в §17.4.8:
Хотя разрешение чтениям видеть записи, которые происходят позже в порядке выполнения, иногда нежелательно, сильный>это тоже иногда необходимо.
Затем он ссылается на программу и трассировку выполнения из §17.4.5 как пример, когда такое поведение необходимо.< /p>
Вот программа:
Тема 1
Тема 2
B = 1;
A = 2;
r2 = A;
r1 = B;
И соответствующая трассировка выполнения:
Код: Выделить всё
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
Трассировка в Таблице 17.4.5-A требует некоторых операций чтения, чтобы увидеть происходящие записи. далее в порядке исполнения. Поскольку в каждом потоке операции чтения выполняются первыми, самым первым действием в порядке выполнения должно быть чтение. Если это чтение не может видеть запись, которая происходит позже, то оно не может видеть никакого значения, кроме начального значения для читаемой переменной. Это явно не отражает все виды поведения.
Может ли кто-нибудь помочь разъяснить, что это значит? Почему мы не можем просто объявить незаконными выполнения, которые позволяют операциям чтения наблюдать за будущими операциями записи?
Например, если мы запретим такие выполнения, разве мы все равно не сможем выдать результат r1? == 1 и r2 == 2 посредством следующего законного исполнения?
Код: Выделить всё
B = 1;
A = 2;
r2 = A; // sees write of A = 2
r1 = B; // sees write of B = 1
Подробнее здесь: https://stackoverflow.com/questions/793 ... ure-writes