Java の「前に発生する」一貫性とは何ですか?また、それはどのように機能しますか?

DDD
リリース: 2024-10-31 16:41:30
オリジナル
452 人が閲覧しました

What is

Happens-Before Consistency を理解する

Java 言語仕様 (JLS) における Happens-Before 一貫性の概念は、一貫した順序付けを指します。マルチスレッド環境で読み取りと書き込みを行います。

Happens-Before 一貫性の定義

一連のアクション A は、すべての読み取り r に対して、Happens-Before 一貫性がある場合に一致します。 A では、W(r) は r によって見られる書き込みアクションです:

  • hb(r, W(r)) (r は W(r) の前に発生しました)
  • またはA には、w.v = r.v および hb(W(r), w) と hb(w, r) の両方の書き込み w が存在しません (r と w の間に矛盾はありません)

回答された質問

1.あなたの理解は正しいですか?
はい、あなたの理解は正しいです。 「次の単語と等しい: ..., ... も ... でもない場合である」は、論理的に正式な定義と同等です。

2. 「w.v = r.v」とはどういう意味ですか?
w.v と r.v は、それぞれ書き込み w と読み取り r によってアクセスされる変数の値を指します。条件 w.v = r.v は、両方のアクションで読み取られる値が同じであることを意味します。

3.実行順序の左側の数字は何を表しますか?
左側の数字は、元のコードのアクションの順序を表します。

4.揮発性フィールドに関するあなたの理解は正しいですか?
はい、あなたの理解は正しいです。最初の実行順序では、A と B が不揮発性フィールドであるため、r2 と r1 の両方で最初の書き込みが 0 になり、読み取りの遅延または不一致が可能になります。

5。この状況 (後で発生する読み取りと書き込み) は現実世界に存在しますか?
はい、存在する可能性があります。一例として、2 つのスレッドがそれぞれのレジスタを通じて共有データにアクセスし、最適化により読み取りスレッドが書き込みスレッドによる変更を検出できない場合があります。

6.実際の例を挙げていただけますか?
次の例を考えてみましょう:

スレッド 1

<code class="java">volatile boolean running = true;</code>
ログイン後にコピー

スレッド 2

<code class="java">while (running) {
  // Perform task
}</code>
ログイン後にコピー

この例では、読み取りスレッドの最適化により、running の更新された値をロードできない場合、スレッド 1 がすでに running を設定しているにもかかわらず、古い値が表示され続け、ループが無期限に実行されます。 false。

以上がJava の「前に発生する」一貫性とは何ですか?また、それはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート