Отношение "происходит до" в модели памяти Java
Что касается JLS ch17 Threads and Locks, в нем говорится: "если одно действие происходит до другого, то первое видно и упорядочено до второго"; Я думаю:
(1) Что на самом деле означает сказать "заказано раньше"? Потому что даже если action_a произойдет до action_b, action_a может быть выполнен после action_b в некоторой реализации, верно?
(2) Если действие action_a происходит до действия action_b, означает ли это, что action_a НЕ ДОЛЖЕН видеть action_b? Или action_a может видеть или не видеть action_b?
(3) Если action_a НЕ происходит до action_b, а action_b НЕ происходит до action_a, означает ли это, что action_a может видеть или не видеть action_b?
(4) Не может быть никаких циклических событий - раньше, верно?
Любой ответ будет оценен:)
2 ответа
(1) Что на самом деле означает сказать "заказано раньше"? Потому что даже если action_a произойдет до action_b, action_a может быть выполнен после action_b в некоторой реализации, верно?
Случается раньше - это причинно-следственные, а не временные отношения. action_a
причинно заказан раньше action_b
или нет, действительно ли он выполняется до этого. На практике, однако, во время выполнения было бы очень трудно поддерживать причинность без временного порядка. Проверьте мой предыдущий вопрос, который входит в некоторые детали на предмет причинности.
(2) Если действие action_a происходит до действия action_b, означает ли это, что action_a НЕ ДОЛЖЕН видеть action_b? Или action_a может видеть или не видеть action_b?
Существует определенный общий порядок видимости действий друг для друга. Это рассматривается разделом, в котором указаны правильно оформленные исполнения. Следовательно, для любых двух действий a и b либо a является видимым для b, либо b для a, либо ничего из вышеперечисленного. Хорошее прочтение, чтобы понять понятие правильно сформированных исполнений, - Примеры моделей памяти Java: Хорошо, Плохо и Уродливо.
(3) Если action_a НЕ происходит до action_b, а action_b НЕ происходит до action_a, означает ли это, что action_a может видеть или не видеть action_b?
Да, либо возможно. Там нет никакой гарантии в любом случае.
(4) Не может быть никаких циклических событий - раньше, верно?
Случаи-до должны наложить частичное упорядочение, и ключевым свойством упорядочения является отсутствие циклов.
Что на самом деле означает сказать "заказано раньше"? Потому что даже если action_a произойдет до action_b, action_a может быть выполнен после action_b в некоторой реализации, верно?
Отношение " происходит до" создает барьер памяти, который препятствует выполнению действия "b" перед действием "a". Таким образом, некоторые базовые оптимизации JVM не могут быть применены. Таким образом, НИКАКОЕ действие-а не может быть выполнено после или вместе с действием-б.
Если action_a происходит - до action_b, значит ли это, что action_a НЕ ДОЛЖНА видеть action_b? Или action_a может видеть или не видеть action_b?
Это означает, что действие-b должно видеть все изменения, вызванные действием-a.
Если action_a НЕ происходит до action_b, а action_b НЕ происходит до action_a, означает ли это, что action_a может видеть или не видеть action_b?
Бывает-раньше это переходные отношения. Таким образом, если действие-а происходит до действия-b, которое происходит до действия-с... и так далее до действия-у, а действие-у происходит до действия-z, то действие-а происходит до действия-z.
Отношение "происходит раньше" гарантирует, что действия, которые следуют за текущим действием, будут видеть изменения, внесенные текущим действием. Если изменения не видны, то не происходит до того, как произойдет.
Не может быть никаких циклических событий - раньше, верно?
Правильно, если действие-а происходит до действия-b, действие-с, действие-d, то ни одно из b, c, d не может произойти до действия-а.
Редактировать:
В JLS говорится, что следует отметить, что наличие отношения "происходит до" между двумя действиями не обязательно означает, что они должны происходить в таком порядке в реализации. Если изменение порядка дает результаты, соответствующие юридическому исполнению, это не является незаконным., Таким образом, если действие-a имеет место до связи с действием-b, то действие-b может выполняться первым при условии, что финал эквивалентен состоянию, если действие a выполнено до действия b. Это зависит от реализации. JIT может решить запустить action-b раньше, чем действие a, при условии, что это изменение в порядке не влияет на конечный результат.
Ну, действие-а не зависит от действия-б. хотя бы теоретически:)
Бывает, прежде чем укажет, последовательные действия. Если действия параллельны, то не происходит раньше.
Примечание. Вся эта путаница происходит из-за того, что JIT удаляет ранее, если нет зависимости между двумя действиями. Пожалуйста, прочитайте об анализе побега.