6

JLS ch17 Threads and Locksに関しては、「あるアクションが別のアクションの前に発生した場合、最初のアクションは2番目のアクションの前に表示され、順序付けられます」と書かれています。私は疑問に思う:

(1) 「先に注文した」とはどういう意味ですか? action_a が action_b の前に発生したとしても、実装によっては action_b の後に action_a を実行できるからですよね?

(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) 周期的な事前発生はあり得ませんよね?

どんな答えでもいただければ幸いです:)

4

2 に答える 2

2

「注文済み」とはどういう意味ですか? action_a が action_b の前に発生したとしても、実装によっては action_b の後に action_a を実行できるからですよね?

Happens beforeリレーションシップは、アクション a の前にアクション b が実行されるのを防ぐメモリ バリアを作成します。したがって、一部の基礎となる JVM 最適化を適用できません。したがって、アクションb の後に、またはアクション b と一緒に、アクション a を実行することはできません。

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 を表示する場合と表示しない場合があることを意味しますか?

前発生推移的な関係です。したがって、action-a が action-b の前に発生し、それが action-b の前に発生し、それが action-c の前に発生した場合 ... 同様に action-y まで続き、action-y が action-z の前に発生した場合、action-a は action-z の前に発生します。

発生前の関係により、現在のアクションに続くアクションが、現在のアクションによって行われた変更を確認できるようになります。変更が見られない場合、事前発生は存在しません。

循環的な事前発生はあり得ませんよね?

そうです、アクション a がアクション b、アクション c、アクション d の前に発生した場合、アクション a の前に b、c、d のいずれも発生しません。

編集 :

JLS は次のように述べています。2 つのアクション間に事前発生関係が存在するからといって、必ずしも実装でその順序で実行する必要があるとは限らないことに注意してください。並べ替えが合法的な実行と一致する結果をもたらす場合、それは違法ではありません。. したがって、アクション a がアクション b との発生前の関係を持っている場合、アクション a がアクション b の前に実行された場合の最終状態と同等であれば、アクション b を最初に実行できます。これは実装固有です。JIT は、この順序の変更が最終結果に影響しない場合、アクション a よりも早くアクション b を実行することを決定する場合があります。

  1. さて、アクションa はアクション bから独立しています。少なくとも理論的には:)

  2. 指定されたシーケンシャルアクションの前に発生します。アクションがparallelの場合、事前発生は存在しません。

注 : この混乱はすべて、2 つのアクション間に依存関係がない場合に、JIT によって事前発生が削除されたためです。エスケープ解析についてお読みください。

于 2014-12-24T12:26:47.143 に答える