並行プログラミングのデザインパターンは、ローカルストレージモードスレッド--ThreadLocal

その本質は、ThreadLocalの共有を避けるためです

ことわざは何の共有はありません経つにつれ、害はありません。レッツは、ThreadLocalのソースを見て、ThreadクラスはthreadLocals変数が含まれ、それが内部クラスである、そこにThreadLocalクラスで定義されているThreadLocal.ThreadLocalMapタイプです。そして、それは地図の構造クラスはまた、エントリ内部クラスが含まれていThreadLocalMapこの内部クラスが実装され、変数の値はThreadLocalのオブジェクトはエントリによって保存されています。

シミュレーションを実現する方法

ThreadLocalの機能を理解することで私たちは質問を考えてみました:どのようにThreadLocalは、それを達成することであり、どのようにそれのスレッド間で変数をバインドするには?実際には、私たちがいる限り、我々は地図構造を介してこの機能を実現することができますよう、自分自身がThreadLocalの機能を実現させた場合。キーは、現在のスレッドで、値の地図が変数の値ですの地図。次の図に示すThreadLocalのデザインのアイデア。

アナログクラスを取得し、削除、設定の三つの方法を提供し、これらの3つの方法が間接的な操作Mapオブジェクトです。ノートマップオブジェクトのキー値にThread.currentThread()、呼び出し元によって渡されないこのキー値の必要性を取得する現在のスレッドです。簡単なのThreadLocalのこの実現には、非常に単純ではないのですか?

 

 

以下は、Javaのデザインです

 

 

 

 

 

図の以下の説明を簡略化することができます。

 

 

我々はデザインとJavaの実装が異なるだけの所有者の地図、ThreadLocalの属し地図内の私たちのデザイン、およびThreadLocalMapは、スレッドの一部であるJava実装です。これらの2つの方法のどちらがより合理的ですか?Javaの実現がより合理的であることは明らかです。内部のJava実装では、ThreadLocalのは、内部のスレッドに関連するすべてのデータを保持していない、唯一のプロキシのツールであり、すべての関連データのスレッドがスレッド内に格納され、この設計は、理解しやすいです。親和性の観点からのデータから、ThreadLocalMapは、より合理的なスレッドに属します。

 もちろん、あるより根深い理由があり、メモリリークを起こしやすいではないが私たちのデザイン手法では、ThreadLocalのは、地図Threadオブジェクトの参照、限り、ThreadLocalのオブジェクトが存在するとして、その後、マップThreadオブジェクトが回復されることはありません手段を開催します開催しました。この設計は簡単にメモリリークにつながることができるようにThreadLocalのライフサイクルは、多くの場合、長いスレッドを超えています。限りThreadLocalMapをリサイクルすることができるようにスレッドオブジェクトは、リサイクルすることができるようにThreadLocalまたは弱い(弱い参照)への参照のJava実装スレッドホールドThreadLocalMap、及びThreadLocalMap、。このことは複雑に見えますが、ジャワの実装が、より安全な。

、私たちは、ソースコードを共有し続けます。

ThreadLocalの設定方法

まず、現在のスレッドオブジェクトを取得し、その後、GetMapリクエスト方法ThreadLocalMapにより、実際には、Threadオブジェクトから取得した現在のスレッドを取得し、最後にキーと値を保存するには、setメソッドThreadLocalMapオブジェクトを呼び出します。注ThreadLocalMapは、Threadオブジェクトが空のオブジェクトの場合は、ThreadLocalMapオブジェクトと関連するスレッドオブジェクトを作成するために、createMapメソッドを呼び出す必要があります。

 

 

 

ThreadLocalのgetメソッド

オブジェクトが空のエントリを取得するには、オブジェクトのgetEntryメソッドをThreadLocalMap呼び出しされていない場合はまず、現在のスレッドのオブジェクトを取得した後、getMapメソッドによって、現在のスレッドをThreadLocalMap取得するには、エントリは、私たちがしたいオブジェクトの値が含まれています。買収は少なくはinitialValue ThreadLocalのオブジェクトに係る方法の初期値を設定するために使用され、最終的に実行されますsetInitialValue方法、の値よりもある場合は、上書きされた方法であることができ、初期値を設定する場合、デフォルトはNULLは、あるはinitialValue

 

 

 

 

ThreadLocalの削除方法

論理削除方法は、単純な、現在のスレッドThreadLocalMapターゲット・オブジェクトへの直接アクセス、及びキー値に対応するオブジェクトを削除する削除メソッドを呼び出しています。

 

 

で使用する場合にThreadLocalメモリリークに注意してください。

なぜメモリがそれをリークする恐れがありThreadLocalのスレッドプールを使用できますか?スレッドプールのスレッドの生存時間の嘘が長すぎるため、多くの場合、手段スレッドがThreadLocalMapを開催している、総死亡、とのプログラムを回復することはないだろう、プラスエントリのThreadLocalMap ThreadLocalの上弱参照(弱い参照)であり、弱参照タイプがあれば、それらのライフサイクルのThreadLocalの端が出て再循環させることができるように、JVMガベージコレクタの場合に他の強い参照が存在しない場合にリサイクルされます。その値エントリのエントリ値、値のライフサイクルの終わりには、メモリリークが生じる、再利用することができないようにしても、強い引用しました。

 スレッドプールでは、我々はどのようにそれを正しく使用するためにThreadLocal?それは自動的に値にJVMの強い参照を解放して行うことができないので、実際には非常に簡単、そして我々は、手動でのThreadLocalクラスでのJavaの使用で、見た目を解放することができるようになります。最終的に()メソッドを削除します。

 

 

{} {}最後にプログラムを試し、最も効果的な解決策、通常我々が学ぶことができます。

 

参考:https://www.jianshu.com/p/812555ba4194

 

おすすめ

転載: www.cnblogs.com/amberJava/p/12452694.html
おすすめ