アートのJava並行プログラミング(6)は、事前発生します

事前発生

操作の実行結果を見られるように、別の操作を必要とする場合JMMにおいて、それは存在していなければならない起こる、前にこれらの二つの操作の間の関係
が起こる-前ルール
(1)プログラムシーケンス規則は:各操作のスレッドを、それが起こる前に、スレッドの任意のその後の動作インチ
(2)ロック・ルールを監視:ロックを解除し、事前発生ロック以降のロック。
(3)揮発性変数ルールは:揮発性ドメインを書き込むために、たまたま、前に揮発性ドメインの任意の後続の読み取りに
(4)の推移は:Aが場合ビフォー起こる B、およびB ビフォー起こる C、次いでA happens-前 Cは、
前の操作が後の動作に先立って行われなければならないことを意味するものではありません、たまたま-前に2つの操作の間の関係があります!それが起こる前に、前の可視の操作後にのみ一回の操作(実行結果)を必要とし、第2の操作前に、以前の動作を配列決定しました。
ここに画像を挿入説明

たまたま定義する前に、

(1)さらに発生し、前の動作を操作する、第2の操作の操作の実行結果が見られる場合、第2の動作前に実行の一次及び放電動作
(2)は、2つの操作事前発生との関係、それが起こる-前に関係が実行されるJavaプラットフォームの実装の特定の順序が指定されなければならないことを意味するものではありません。事前発生関係が行われるように並べ替え後の結果は、結果と一致し、この並べ替えは違法ではない場合(JMM、このような並べ替えを可能にします)

たまたま、前のルール

(1)プログラム・シーケンス・ルール:各操作スレッドは、事前発生後続の操作スレッドに。
(2)モニターロックルール:ロックを開錠、起こり-前にロックの後続のロック
(3)揮発性変数ルール:揮発性ドメインを書き込むために、ドメイン揮発性リードこれが起こる前に、後続の。
ここに画像を挿入説明
(4)の推移:AはBの前に、発生し、そしてBは、Cする前に、発生し、その後発生し、前にC A場合
(5)スタート()ルール:スレッドAの実行操作ThreadB.start()は(スレッドBを開始する)場合、次いで、スレッド
ThreadB.start()オペレーションは、たまたま、前スレッドBの任意のアクション
ここに画像を挿入説明
共有変数を変更するために予めスレッドは、Bは、最初の共有変数(B-可視の修飾)を読み取るだろうスレッド次に、スレッドBを開始させます。
(6)参加()ルール:スレッドAの実行操作ThreadB.join()戻りが正常、その後、任意の次の事前発生した場合()操作でスレッドAにスレッドB ThreadB.joinから正常復帰します。
ここに画像を挿入説明

AS-IF-シリアル

実行結果(並列度を向上させるために、コンパイラやプロセッサ)を並べ替えする方法に関係なく(シングルスレッド)プログラムを変更することはできません。-IF-シリアルコンパイラ、ランタイムおよびプロセッサが遵守しなければなりません
コンパイラやプロセッサは、動作データとの関係の有無に依存しないだろう、それは結果を変更しますので、並べ替え、再発注を行います。しかし、操作の間のデータ依存性の欠如は、これらの動作は、コンパイラおよびプロセッサを並べ替えることができれば。

    double pi=3.14; A
    double r=1.0; B
    double area=pi*r*r; C

Cが先AB、AとBの並べ替え発生する可能性がありますしない
よう-IF-シリアル変わっていないシングルスレッドプログラムのセマンティクス保証の結果を、事前発生関係保証マルチスレッドプログラムの結果が正しく同期に変更されていません。

公開された24元の記事 ウォンの賞賛1 ビュー546

おすすめ

転載: blog.csdn.net/qq_45366515/article/details/105129536