-volatileキーワードとThreadLocalの詳細な揮発性のキーワードとのThreadLocalをマルチスレッド

volatileキーワードとのThreadLocal

1、3つの、並行プログラミングの概念

原子性:1つ以上の操作。実装プロセスのすべての実行と終了が中断されていないか、行わないであろういずれか。最も一般的な例:I ++ / i--操作。あなたがスレッドの同期をしない場合はアトミックでない操作は、可能性の高い安全性の問題を引き起こします。

可視性:複数のスレッドが同じ変数にアクセスし、スレッドは他のスレッドがすぐに値の変化を見ることができ、この変数の値を変更しました。問題の可視性は、保証の2つの方法があります。まず、揮発性のキーワード、第二には、同期とロックすることです。後で詳しく説明します。

注文:オーダーコードで実行されるプログラムの実行シーケンス。

命令の並べ替えを発注について知る必要性を理解するために。プロセッサの動作効率を提供するために、コードの最適化は、各ステートメントの実行の順序を保証するものではありませんが、コードの実行の結果の実装では、順序と一致し、それは単一スレッドの結果に影響を及ぼさないが、同時に実行されるスレッドの精度に影響を与えるようになります。命令の並べ替えは、命令間のデータ依存関係は、命令のコマンドB Aの結果場合に使用する必要があり、プロセッサは、その前にA Bに確保するために実行されると見なし

並行プログラムの正しい実装を確保するために、我々はアトミック、可視性と秩序を確保する必要があります。限り保証がないとして、それはプログラムが正しく実行する可能性があります。

 2、Javaのメモリモデル

Javaのメモリモデルの指定:メインメモリの存在は、すべての変数は、各スレッドは、独自のワーキングメモリを持っています。変数のスレッド化操作はワーキングメモリ、メインメモリ内になければなりませんし、直接操作することはできません。そして、各スレッドは、他のスレッドの作業メモリにアクセスすることはできません。

原子性、視認性と自身が提供するJava言語の規則を確認してください。

アトミック:参照変数のJava、および(長いと二重を除く)、読み出し元のデータ型のほとんどの操作はアトミックです。これらの操作は実行のいずれかを実行、中断またはないことはできません。変数がvolatileとして宣言されたすべての読み取りと書き込みのために、彼らは(longとdoubleを除く)原子であります

可視性:javaは視認性を確保するために揮発性のキーワードを提供します。

注文:Javaのメモリモデルは、それはコンパイラやプロセッサの命令が並べ替えすることができます。これは、複数のスレッドの同時実行の精度に影響を及ぼします。Javaでは揮発性のキーワードだけでなく、同期とロックを注文して確保することができます。同期ロック秩序を確保するために、スレッドの直列化は、同期コードを実行させる、そのたびに一つだけスレッド同期コードの実行を確実にするために。どのように揮発性の保証は後で説明します。

 詳細3、volatileキーワード

視認性を確保し、並べ替えコマンドを禁止したときに操作変数に別のスレッド:揮発された後修飾共有変数(クラスメンバ変数、静的クラスのメンバ変数)が、これは2つの意味を有します。

Javaは、視認性を確保するために揮発性のキーワードを提供します。

共有変数がvolatile宣言されたとき、それは変更された値がすぐにメインメモリに更新されていることを確認します。他のスレッドを読みながら、新しい値をメモリから読み込まれます。普通株式の変数は、それが不確実なメモリタイミングに書き込まれ、可視性を保証することはできません。読んだとき、他のスレッドは、古い値を読むことができます。
また、ロックによって同期性と視認性を確保することができます。彼らは一つのスレッドだけがロックしてから同期コードを取得していることを確認することができます。そして、ロックのリリース前に修正変数はメモリに住んで洗い流します。視認性を確保するために。
volatileキーワードの原理とメカニズム:
volatileキーワードを追加する場合は、ロックプレフィックス命令のよりになります。ロックは、3つの機能を提供するメモリバリアに対応する命令の前に付けます。
  1、すぐにメインメモリに書き込まれたキャッシュの動作を変更するために強制されます。
  書き込み動作は、それがCPUに対応する他の無効なキャッシュラインせる場合2は、
  3を、その後続の命令は、メモリバリアを指定並べ替え前の位置に排出することを保証しないであろう、また先行命令が排出されるであろうバリアの後ろメモリ。メモリバリアコマンド句を実行するとき、すなわち、その前に動作が完了しました。

揮発性の缶は、変数のいずれかの操作がアトミックであることを保証するものではありませ:ということに注意してください。

あなたは、volatileキーワードの使用のための2つの条件を持っている必要があります。

  1、変数への書き込みは、現在の値に依存しません。

  図2に示すように、変数が他の変数と不変に含まれていません。

4、ThreadLocalの詳細な

ThreadLocalの、スレッドローカル変数は、スレッドローカルストレージと呼ばれることができます。これは、スレッドごとに変数のコピーを個別に維持します。可視領域は、同じスレッド内のオブジェクトに限定されます。

ThreadLocaクラスには、いくつかの一般的なメソッドを提供します。

パブリックTのGET(){} ---取得ThreadLocalのが現在のスレッド内の変数のコピーを保存し
ます。public voidセット(T値){ } --- 現在のスレッドのコピーが可変に設けられている
公共のボイドのremove(){} ---シフト現在のスレッドのコピー内の変数に加えて、
TはinitialValueを保護(){} ---保護改変方法。ThreadLocalのは、変数が参照型である場合、唯一の浅いコピーを提供し、その後、私たちは深いコピーを達成するために、この関数を書き換える必要があります。機能を書き換えThreadLocalの開始を使用している場合、それをお勧めします

ThreadLocalの処置:すなわちThreadLocalの内のスレッドが別のスレッド間で共有されるスレッドの範囲内のローカル変数を、達成が単離されます。

ThreadLocalの原則:キーとして現在のThreadLocalインスタンスの使用ThreadLocalの格納された値、地図が行く現在のスレッドオブジェクトに格納されています。ソースコードを見るために開始する前に、私は鍵が地図にThreadLocalのオブジェクト内に堆積されるように、現在のスレッドオブジェクトだと思います。

おすすめ

転載: www.cnblogs.com/alex-xyl/p/12462381.html