blog

JAVA並行処理(5)happens-before

JDK5以降、JMMは複数のスレッド間のメモリの可視性を記述するためにhazards-beforeの概念を使用しています。 JMMでは、ある操作の実行結果が別の操作から見える必要がある場合、2つの操作...

Mar 6, 2020 · 3 min. read
Share this

JDK5以降、JMMはhazards-beforeの概念を使用して、複数のスレッド間のメモリの可視性について詳しく説明しています。 JMMでは、ある操作の実行結果を別の操作で可視化する必要がある場合、2つの操作の間にhazards-beforeの関係がなければなりません。ここで言う2つの操作は、同じスレッド内でも、異なるスレッド間でもかまいません。

happens-before

happens-beforeの原則は非常に重要で、データ競合があるかどうかを判断する主な根拠となります。スレッド安全性はこの原則に依存し、並行環境における2つの操作の間に競合があるかどうかのすべての問題を解決します。例えば

i=1; // スレッド A j=i; // スレッド B

jは1に等しいですか?スレッドAの操作がスレッドBの操作の前に起こると仮定すると、スレッドBの実行後にj = 1が成立しなければならないと判断できます。happens-beforeの原理は次のように定義されます:

  1. ある操作が他の操作より先に起こる場合、最初の操作の実行結果は2番目の操作から見えることになり、最初の操作は2番目の操作より先に実行されることになります。

  2. 2つの操作の間にhapens-beforeの関係が存在することは、必ずしもhapens-beforeの原則によって確立された順序で実行されなければならないことを意味しません。順番を入れ替えた結果が hapens-before の関係に従って実行した結果と同じであれば、この順番の入れ替えは違法ではありません。

最初のものは、プログラマの便宜のためのもので、このようにhapens-beforeの関係として理解することができます: AがBの前に起こる場合、Javaのメモリモデルは、プログラマに保証します: - Aの操作の結果はBに見えるようになり、AはBの順序で実行されることに注意してください。これは、Javaのメモリ・モデルがプログラマに対して行う保証にすぎません!実際には再順序付け不可能ではありません。

もう1つは、コンパイラとプロセッサの並び替えのための拘束原理です。コンパイラとプロセッサは、プログラムの実行結果を変えない限り、何でもできます。つまり、1つ目はプログラマ関係の便宜を図っているだけで、結果が変わらない限り、それが本当に並び替えかどうかは問題ではありません。

happens-before

  1. プログラム順序規則:スレッド内の各操作は、そのスレッド内の後続の操作の前に発生します。

  2. モニター・ロック・ルール:ロックのアンロックは、そのロックの後続のロックの前に起こります。

  3. 揮発性変数ルール:揮発性フィールドへの書き込みは、その揮発性フィールドの後続の読み取りよりも前に発生します。

  4. start() 規則: スレッド A が ThreadB.start() 操作を実行する場合、スレッド A の ThreadB.start() 操作は、スレッド B の後続の操作よりも先に発生します。

  5. join () のルール:スレッド A が ThreadB.join () 操作を実行して正常に返された場合、ThreadB.join () 操作が正常に返される前に、スレッド B の任意の操作がスレッド A で発生します。

  6. プログラム割り込みルール:スレッドinterrupted()メソッドの呼び出しは、割り込み時間を検出する割り込みスレッドのコードに先行します。

  7. オブジェクトのファイナライズ規則:オブジェクトの初期化の完了は、そのfinalize()メソッドの開始に先行します。

happens-beforeJMMとの関係

happens-beforeルールは、図に示すように、1つ以上のコンパイラとプロセッサの並べ替えルールを定義します。これにより、Javaプログラマは、JMMが提供するメモリ可視性保証を理解するために、複雑な並べ替えルールとその具体的な実装を学ぶ必要がなくなります。

学習ソース Javaにおける並行プログラミングの技術

個人的な意見です。議論へようこそ、個人ブログ

JAVAにおける同時並行プログラミングの課題

JAVA並行同期と揮発性の基本的な実装原理

JAVA並行ロック状態

JAVA並行アトミック操作の実装原理

JAVA concurrencyhappens-before

Read next

市場裁定取引戦略 詳細結論

現在、暗号資産の全体的な時価総額のため、暗号資産のクオンツ取引に従事するチームの数はまだ比較的少なく、1つのクオンツチームの管理規模は主に数百万~数千万米ドルの範囲に集中しており、一部のトップクラスの暗号資産クオンツチームは時価総額数億米ドルの管理規模を達成することができます。世界には安定した資産運用能力を持つ暗号資産のクオンツチームが数百あり、その平均運用規模は1,000万ドル...

Mar 6, 2020 · 2 min read