どのように可視性の問題を解決するためのJavaの抗骨が複雑です

序文

いくつかの時間前、私は「についての記事を書いたJavaの抗骨に同時原子の問題を解決する方法である、ボーエン」。

その中でも、ポイントを作る:Javaは中の原子の同時の問題を解決するために、ミューテックスとCASを使用しています。

だから、この記事は探求する主にされています。

JavaでJavaを使用するためにどのようにメモリ・モデルの揮発性仕様、同期、最後のキーは、視認性の問題を解決します。


テキスト

フォーカスを開始する前に、我々は、上記の2つのキーワード、すなわち注意メモリモデル可視性の問題を。

著者として「ハードウェア&ソフトウェアの並行プログラミングがピットを掘っJava用(可視&アトミック&秩序)の抗骨、」テキストは、可視性は、私は信じて通過は、だけで、この記事では、必要性のために視認性をさらに説明を行っています。

だから、可視性の問題を解決するの話をする前に、我々は問題&Javaのメモリモデルの可視性について話をする必要があります。

問題の可視性とは何ですか?
  • 可視性、共有変数のスレッド後の主な重点は更新され、共有変数スレッドへのフォローアップの訪問は、最新の結果に更新してすぐに読み出せないことがあり、でも修正されている共有変数に他のスレッドを学んだことはありません操作。したがって、この問題は、我々はそれを呼び出すことができます。問題の可視性。

    もちろん、問題の可視性もあるスレッドの安全性の症状の一つが。

    セキュリティスレッドの症状、すなわち:原子、秩序と可視性。


Javaのメモリモデル(JMM)とは何ですか?
  • 要するに、Javaのメモリモデルは、JVMのアトミック性、秩序と可視性の問題を解決する方法について説明します仕様のセットです。

    私たちは、Javaオブジェクトは、一般的に、ヒープ上に置かれていることを知っている、とヒープメモリはスレッドで共有されているので、Javaのメモリモデルの範囲は、一般的にだけでヒープメモリを必要とします。ここで、JMMは、図1-1の比較画像を有します。

    エンタープライズマイクロチャネル20190903043012.png

私たちは、仲介として働き、メインメモリの真ん中に、JMMスレッドを見ることができます。

スレッドとメインメモリのみJMMで通信することができた場合、その後、JMMは唯一の支配です!

次JMMの自己紹介は以下のとおりです。

大家好,我叫Java memory model(JMM)
为了更好的解决并发编程中的线程安全性问题,即保证并发中的原子性、有序性和可见性。
所以,我规定了以下规则。
规则一:每个线程都有独立的工作内存, 即工作内存(本地线程)
规则二:所有的共享变量都必须在主内存中, 且只能通过JMM进行控制访问。
规则三:所有的共享变量都必须在主内存中,每个线程都有自己的工作内存(本地内存),线程的所有操作都必须在工作内存中进行,而不能直接对主内存进行操作。
规则四:工作内存之间禁止互相访问。
复制代码

絶対的な力を武器に、その後、JMMは、開発することができ、視認性の規範を:

例:スレッドAが場合、スレッドBを通信したい場合

  • まず、メインメモリにフラッシュメモリの共有変数のローカルコピーを更新する必要がスレッド。
  • その後、スレッドBは、ローカルメモリはメインメモリに直接変数を共有読み値、自身のローカルメモリのメインメモリに読み込まれた値を飛ばし読み。

ここから分かるように、メインメモリ及び各スレッドのローカルメモリとの間の相互作用を制御することにより、JMMは、オブジェクトの可視性を達成します。


我々はすべて知っているように、JMMは抽象的で複雑な仕様のセットで、その後、どのように現実的な方法で利用できる抽象的、複雑な仕様は、それになり?

だから、最終的にJavaはそのマルチスレッド環境を確保するために使用することを意味したり対策するもので、共有変数の可視性は、(揮発性&ファイナル&ロック)即時です。
  • 同期またはLock--ミューテックス:意味

    並行プログラミングでは、ミューテックスを使用することにより、一般的には、すべての並行性の問題を解決することができます!

    そのため、視認性がミューテックス保護を使用することができます。

  • 二つの意味:volatileキーワード

    ここで私は私が導入される別のブログ記事を書きます原則として基本となるvolitale特定の基本的な実装の詳細の実現を話すことはありません。

    実際に、改変volitaleキーワードは、二つのセマンティクス(ここでセマンティクスは、暗黙のルールとして理解することができる)と、変数を共有しました。

    • セマンティック1:視認性を確保します。つまり、共有変数のスレッドの変更は、他のスレッドが直ちに表示されることを確実にするために、です。

      すぐに目に見えるvolatileキーワードの保証、ここで注意すべき点がいくつかあります。

      まず、volatileキーワードの使用がされ強制的にすぐにメインメモリに書き込み/読み出し(共有変数)値を変更します。

      メインメモリに書き込まれた義務を達成するためにどのように?

      図1-1では、我々は、スレッドAがあることを確認し、Bをスレッドすることができます そして、スレッドは、共有変数の変更は、メモリ障害を作動共有変数スレッドBのコピーをもたらすであろう。

      メインメモリを読むことが必須達成するためにどのように?

      ワーキングメモリ内の共有変数のスレッドのコピーが失敗したら、それはメインメモリから最新の値を再読み込みしなければなりません。

      もちろん、ここではまずvolitale、読者はすでにそれを見たと信じて参照、セマンティックの使用キャッシュ・コヒーレンシ・プロトコル(MESI)を確保しました。

    • セマンティック2:秩序確保。

      金額は...少し古くなって表示されるように、この記事に順序で物事を保つように思われます。

      とにかく、読者は覚えているだけです。

      volitaleキーワードの使用は、並べ替え命令を禁止し、秩序を保証するために、コンパイラの最適化を禁止しています。

  • 3つの手段:finalキーワード

    変数(基本型)の存在最終修正なら不変かつ唯一の割り当てを有する、すなわち、割り当てを一旦変更することができません。

    不変変数やオブジェクト、私たちは安全な変数/オブジェクトをスレッドにそれを呼び出すことができます。

    finalキーワードに修正される変数は不変で、あるため、関係なく、マルチスレッド環境でどのように動作するか、彼らは同じ値ではありません。

    だから、最後のキーは、視認性の手段を確保することです。


概要

  • Javaのメモリモデルは、また、ワーキングメモリとメインメモリの概念を定め一貫性モデル、抽象的規範の複雑なセット、として知られています。

  • 可視性と秩序を確保するために:volitaleキーワードは、二つの意味を持っています。

  • マルチスレッド環境ですぐに表示されているので、最後のキーワードは、不変(プリミティブデータ型は、バイト、int型... ..)を意味します。

  • 同期、volitale、最後の3つのキーワードは、高めのJavaメモリモデルの問題の可視性に対する解決策として見ることができます。

おすすめ

転載: juejin.im/post/5d6e526be51d4561c75f285e