В JLS написано, что происходит до отношения JMM (раздел 17.4.5):
Следует отметить, что наличие связи между двумя действиями не обязательно означает, что они должны происходить в этом порядке в реализации.
Меня интересуют примеры этого утверждения.
Правильно ли я понимаю, что примером этого может быть следующее:
Thread 1
x = 1
lock M
y = 2
unlock M ----------------------->Thread 2:
lock M
z = 3
w = 4
unlock M
Очевидно, что в этой трассировке выполнения существует связь между (x = 1) и (w = 4) «происходит раньше»:
(x = 1) happens-before (w = 4)
Также в этом случае (x = 1) заказывается с (w = 4) в трассе выполнения.
Thread 1
не использует переменную w
. Следовательно, мы можем разместить его перед (x = 1), не нарушая логики Thread 1
и Thread 2
.
Означает ли это, что если мы переупорядочиваем (x = 1) и (w = 4), то это происходит до того, как отношения между этими утверждениями сохранятся?
Если у вас есть другие примеры, пожалуйста, укажите.