別の角度から理解するJava同時

  シーケンシャル一貫性一貫性モデルを武器に、私たちは、Java並行処理でルックを再。

  私たちは、地元のための処理だけを残してシーケンシャル一貫性を述べてきたように。CPUの命令並べ替え、マルチレベルキャッシュメモリの不整合やその他の問題は、ハードウェアレベルシーケンシャル一貫性を提供するために実装するソフトウェア開発者を必要としませんでしたので、私たちは、上記学びました。ここでは、Javaでシーケンシャル一貫性を達成する方法を見て。

  シーケンシャル一貫性は、Javaの基礎に、事前発生関係のJVMです。Java言語仕様のメモリモデルでは、事前発生関係を提供し、適切に取り扱い事前発生関係が正しく並行処理を実装するJava言語の基礎です。明らかであろそのスレッド内の同じコード、後者actionhappens-前に、前述のアクション。しかし、それは後の実装で発生したために、2つのアクションが事前発生関係、必ずしもがあっても、言いました。限り、並べ替えられた順序が正当な結果を生成するように、我々は受け入れることができます。

  

 

  「合法的な」結果は「法的な」結果があなたの期待を満たしていることを意味するものではありませんので、ここで注意してください。

  そこに2つのアクションが関係-前に起こっている、と彼らはコードが事前発生関係を尊重していない場合はむしろ、彼らは必ずしもその順序で発生しません。

  例えば、2つのスレッドが同時にデータにアクセスするために、一つのスレッドは、ビューの別のスレッドに読み出し動作を書き込み、順不同であってもよいです。

  

 

  例えば、それを見てみましょう。2つのスレッドXとYは、2つの変数A及びBにアクセスすることができると仮定し、AとB最初はゼロです。

  Xでの実行スレッド

  A = 5

  B = 5

  AとBが同時にYスレッドを読み込まれ、次にB = 5を読み取る可能性がない(実際にはJavaは同時に、我々はその後、Aが読み出され、最初のBを読み取ることができる変数の二つの原子を読んでいません) 、A = 0は、それ?直感的に、それは不可能です。Bが5に読み出された場合X以来更新は、Bを更新した後、次いでさらに5匹の魚であるべきです。

  AとBが同時にYスレッドを読み込まれ、次にB = 5を読み取る可能性がない(実際にはJavaは同時に、我々はその後、Aが読み出され、最初のBを読み取ることができる変数の二つの原子を読んでいません) 、A = 0は、それ?直感的に、それは不可能です。Bが5に読み出された場合X以来更新は、Bを更新した後、次いでさらに5匹の魚であるべきです。

  

画像のキャプション

 

  しかし、Javaのメモリモデルは、それがこのような状況は、可能な明確であること。コンパイラは考えているので、

  A = 5

  B = 5

  と

  B = 5

  A = 5

  まあ違いはありませんので、その抜本的なスワップため、最初に実行問題ではありません。

  

画像のキャプション

 

  だから、正しい事前発生関係を確立するために必要なプログラミングでは、あなたが望む結果を得るためです。確立された方法は、Java言語仕様を参照することができます。

  例えば、Java言語仕様は、揮発性の所定のフィールドを記述するためには、事前発生後続の読取りのフィールドを。のみならず、すべてのスレッドに直ちに可視揮発性フィールドの値は事前発生関係を決定した後、また、制限は、フィールド・オペレーションの順序を変更するためにアクセス。

 

おすすめ

転載: www.cnblogs.com/qfjavabd/p/10983855.html