В главе 17 JLS, он вводит понятие: происходит - прежде, чем согласовано.
Набор действий A является согласованным, если для всех чтений r в A, где W (r) - это действие записи, наблюдаемое r, то не так, что либо hb (r, W (r)), либо что там существует запись w в A такая, что wv = rv и hb (W (r), w) и hb (w, r) "
В моем понимании это равносильно следующим словам: ..., это тот случай, когда ни ... ни ...
Итак, мои первые два вопроса:
- я правильно понимаю?
- что означает "w.v = r.v"?
Также приводится пример: 17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
В первом порядке исполнения:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
Сам заказ уже сказал нам, что два потока выполняются поочередно, поэтому мой третий вопрос: что означает левое число?
Насколько я понимаю, причина того, что и r2, и r1 могут видеть начальную запись 0, - это то, что A и B не являются изменчивым полем. Итак, мой четвертый вопрос: правильно ли я понимаю?
Во втором порядке исполнения:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
Согласно определению согласованности «происходит до того, как», нетрудно понять, что этот порядок выполнения происходит до согласованности (если мое первое понимание верно). Итак, мои пятый и шестой вопросы: существует ли такая ситуация (чтение, запись, запись, которая происходит позже) в реальном мире? Если да, не могли бы вы привести мне реальный пример?