Позволяет ли «порядок программы» в Java изменять порядок?

В одной теме у меня есть

write a = 0
write a = 1
write volatile flag = 1

Во 2-й теме у меня есть

read volatile flag // This always happens after I write volatile flag in thread 1
read a

Может ли произойти переупорядочение, чтобы я увидел, что read a возвращает 0 во 2-м потоке?

Если нет, может кто-нибудь, пожалуйста, подробно объяснить, почему?

Я спрашиваю, потому что я озадачен этим определением из JLS:

Среди всех межпоточных действий, выполняемых каждым потоком t, программный порядок t является общим порядком, отражающим порядок, в котором эти действия будут выполняться в соответствии с внутрипоточной семантикой t.

Как будто допускает переупорядочивание в данной ситуации?


person Alexander Kulyakhtin    schedule 28.08.2014    source источник
comment
можешь выложить код?   -  person Andrey E    schedule 28.08.2014
comment
возможный дубликат Изменить порядок нормального поля вокруг изменчивого поля   -  person Joe    schedule 28.08.2014
comment
Повторение stackoverflow.com/questions/25548547/?   -  person Joe    schedule 28.08.2014


Ответы (2)


Может ли произойти переупорядочение, чтобы во втором потоке я увидел возвращаемый 0?

Нет, нет, если ваше утверждение верно: «Это всегда происходит после того, как я пишу флаг volatile в потоке 1».

Последнее обновление, которое поток 1 внес в переменную a перед обновлением volatile flag, будет видно потоку 2 после того, как поток 2 прочитает флаг volatile.

Более подробное объяснение см. в разделе 3.1.4 книги Параллелизм Java на практике Брайана Гетца: https://rads.stackoverflow.com/amzn/click/com/0321349601


Но заметьте! Можно считать плохой практикой полагаться на чтение и запись изменчивой переменной для синхронизации других переменных. Проблема в том, что взаимосвязь между volatile-переменной и другими переменными может быть неочевидна для других программистов, работающих над тем же кодом.

person Solomon Slow    schedule 28.08.2014

Как сказано здесь

Старая модель памяти позволяла переупорядочивать записи во энергозависимой памяти с чтением и записью в энергонезависимой памяти, что не соответствовало представлениям большинства разработчиков о энергозависимой памяти и, следовательно, вызывало путаницу.

Таким образом, такое поведение на данный момент устарело (поскольку JSR-133 был введен и вступил в силу в Java 5.0).

А, во-вторых, как сказано здесь

Действия, связанные друг с другом в программном порядке, не исключают возможности «переупорядочения».

person Johnny    schedule 17.09.2017