Известно, что JVM не должна переупорядочивать операторы из синхронизированного блока вне синхронизированного блока.Учитывая это, разрешено ли JVM изменять порядок назначения y = 7
после блока synchronized
в следующем фрагменте?
x = 5;
y = 7;
synchronized (this) {
x = 6;
}
Мы знаем, что присвоение переменной перед синхронизированным блоком может быть переупорядочено, чтобы происходить внутри блока.Таким образом, следующее должно быть допустимым переупорядочением исходного кода:
x = 5;
synchronized (this) {
x = 6;
y = 7;
}
Можно утверждать, что, поскольку это действительный порядок, присваивание y
не может произойти после блока synchronized
, поскольку это нарушитправило, что код из синхронизированного блока не должен переупорядочиваться, чтобы происходить после блока, и вывод, что y
происходит до конца синхронизированного блока.
С другой стороны, может быть, что все упорядочения не эквивалентны, и имеет значение, какое упорядочение было фактическим упорядочением.В частности, если y
присваивание было первоначально выполнено в синхронизированном блоке, оно не могло бы произойти после блока, в противном случае это могло бы произойти.
Подводя итог, является ли следующий порядок действительным упорядочением первого фрагмента?
x = 5;
synchronized (this) {
x = 6;
}
y = 7;