その本質は、ThreadLocalの共有を避けるためです
ことわざは何の共有はありません経つにつれ、害はありません。レッツは、ThreadLocalのソースを見て、ThreadクラスはthreadLocals変数が含まれ、それが内部クラスである、そこにThreadLocalクラスで定義されているThreadLocal.ThreadLocalMapタイプです。そして、それは地図の構造クラスはまた、エントリ内部クラスが含まれていThreadLocalMapこの内部クラスが実装され、変数の値はThreadLocalのオブジェクトはエントリによって保存されています。
シミュレーションを実現する方法
ThreadLocalの機能を理解することで私たちは質問を考えてみました:どのようにThreadLocalは、それを達成することであり、どのようにそれのスレッド間で変数をバインドするには?実際には、私たちがいる限り、我々は地図構造を介してこの機能を実現することができますよう、自分自身がThreadLocalの機能を実現させた場合。キーは、現在のスレッドで、値の地図が変数の値ですの地図。次の図に示すThreadLocalのデザインのアイデア。
図の以下の説明を簡略化することができます。
我々はデザインとJavaの実装が異なるだけの所有者の地図、ThreadLocalの属し地図内の私たちのデザイン、およびThreadLocalMapは、スレッドの一部であるJava実装です。これらの2つの方法のどちらがより合理的ですか?Javaの実現がより合理的であることは明らかです。内部のJava実装では、ThreadLocalのは、内部のスレッドに関連するすべてのデータを保持していない、唯一のプロキシのツールであり、すべての関連データのスレッドがスレッド内に格納され、この設計は、理解しやすいです。親和性の観点からのデータから、ThreadLocalMapは、より合理的なスレッドに属します。
もちろん、あるより根深い理由があり、メモリリークを起こしやすいではないが。私たちのデザイン手法では、ThreadLocalのは、地図Threadオブジェクトの参照、限り、ThreadLocalのオブジェクトが存在するとして、その後、マップThreadオブジェクトが回復されることはありません手段を開催します開催しました。この設計は簡単にメモリリークにつながることができるようにThreadLocalのライフサイクルは、多くの場合、長いスレッドを超えています。限りThreadLocalMapをリサイクルすることができるようにスレッドオブジェクトは、リサイクルすることができるようにThreadLocalまたは弱い(弱い参照)への参照のJava実装スレッドホールドThreadLocalMap、及びThreadLocalMap、。このことは複雑に見えますが、ジャワの実装が、より安全な。
、私たちは、ソースコードを共有し続けます。
ThreadLocalの設定方法
ThreadLocalのgetメソッド
ThreadLocalの削除方法
論理削除方法は、単純な、現在のスレッドThreadLocalMapターゲット・オブジェクトへの直接アクセス、及びキー値に対応するオブジェクトを削除する削除メソッドを呼び出しています。
で使用する場合にThreadLocalメモリリークに注意してください。
なぜメモリがそれをリークする恐れがありThreadLocalのスレッドプールを使用できますか?スレッドプールのスレッドの生存時間の嘘が長すぎるため、多くの場合、手段スレッドがThreadLocalMapを開催している、総死亡、とのプログラムを回復することはないだろう、プラスエントリのThreadLocalMap ThreadLocalの上弱参照(弱い参照)であり、弱参照タイプがあれば、それらのライフサイクルのThreadLocalの端が出て再循環させることができるように、JVMガベージコレクタの場合に他の強い参照が存在しない場合にリサイクルされます。その値エントリのエントリ値、値のライフサイクルの終わりには、メモリリークが生じる、再利用することができないようにしても、強い引用しました。
スレッドプールでは、我々はどのようにそれを正しく使用するためにThreadLocal?それは自動的に値にJVMの強い参照を解放して行うことができないので、実際には非常に簡単、そして我々は、手動でのThreadLocalクラスでのJavaの使用で、見た目を解放することができるようになります。最終的に()メソッドを削除します。
{} {}最後にプログラムを試し、最も効果的な解決策、通常我々が学ぶことができます。
参考:https://www.jianshu.com/p/812555ba4194