ThreadLocalのは、変数の共有とローカルストレージに加えて、ThreadLocalのは、競争条件が発生しないことを確実にします。理解していません?
TODO:多くの記事のようにThreadLocalの、使用は何を見てする必要が、どのような原則があり、そしてどのような関係があるのJVM
現在のスレッドで独自のを持っていることができるようにするためにThreadLocal変数は、問題を解決しないとの同期を解決することはできません、リソース共有の問題
理解THREADLOCAL
TODO:次のいくつかの段落を仕上げ(異なる場所から引用し、式は非常に混乱を招く可能性があります)
通常の状況下で、我々は変数がアクセスするいずれかのスレッドもして変更することができます作成しています。ThreadLocalの変数の使用は、現在のスレッドのアクセスによって作成することができ、他のスレッドがアクセスおよび変更することができません。
ThreadLocalのオブジェクトは、別のスレッド(実際には異なるインスタンス)内の別のコピーが存在し、同じ含まれています。たとえば、次のようにするためにThreadLocal<String>
別のスレッドstringある目的変数の種類を保持します。
ThreadLocalのは、スレッドローカルインスタンスを提供します。これは、各スレッドがコピーの完全に独立したインスタンスの初期化変数を使用することは通常の変数とは異なります。ThreadLocalの変数は、通常されているprivate static
(ポリシー)を修正しました。スレッドの終了時に、それが使用するThreadLocalの相対的コピーのすべてのインスタンスを再利用することができます。
ローカル変数スレッドを提供THREADLOCAL、各スレッドは、ローカル変数のセット()およびGet()によって操作することができるが、データ分離スレッドを達成するために競合し、ローカル変数、他のスレッドではありません。ThreadLocal変数を埋めるためにあるその変数の他のスレッドが分離され、現在のスレッドに属しています。
- ThreadLocalのそれぞれ適当の例は、独自の個別のスレッドと複数の方法で使用されるインスタンスを要求、スレッド間すなわち可変スペーサとシーン法またはクラス間で共有します
- たとえば、他のアクセス不可能なスレッド、コピーの各コピーは、現在のスレッドのみで使用することができますスレッド。
- ThreadLocalのは解決しないマルチスレッド共有の変数問題は、同期の問題を解決しません
- 情報の共有がないので、そこには自然な競争の問題は、このようにいくつかのケースではセキュリティスレッドをパフォーマンスの低下を確実に、ではない、とスレッドの安全性を検討する例いくつかを回避させるに同期させる必要があります
- ⭐️⭐️⭐️⭐️しばしばれる
private static
(修飾戦略を(あれば、このスレッドで定義した通りであるような)全てのそのようなオブジェクトは、顔の変化を操作することができます)。- 静的には、スレッドセーフであるため、同じクラスの異なるインスタンスは、異なるインスタンスのクラス別のスレッドです
- 同様のスレッドで別のクラスのインスタンスは、同じインスタンスを共有します
- 代わりに、スタックのヒープ上(TODO:理解する方法)
ThreadLocalの原則
TODO:ThreadLocalMap、InheritableThreadLocal理解し、次の5点を仕上げ
- それぞれがThreadLocalMapへの参照を維持スレッド
- ThreadLocalの内部クラス、ストレージのエントリがThreadLocalMapあります
- ThreadLocalのセット()メソッドを呼び出すとき、値が実際ThreadLocalMapに設定され、キーThreadLocalのオブジェクトであり、オブジェクトはの値に渡されます
- あなたが得るのThreadLocal()メソッドを呼び出すと、実際には、値ThreadLocalMapを取得するには、キーはThreadLocalのオブジェクトであります
- 自身THREADLOCAL値を格納していない、それだけでスレッドがThreadLocalMapから値を取得してみましょうするためのキーとしてあります。
ThreadLocalのメンテナンスの(未JDK実装)(思考)のマッピングスレッドインスタンス
各スレッドは、「ローカル」インスタンスのコピーのThreadLocal変数への独自のアクセス権を持っているので。一つの可能な解決策はThreadLocalの地図を維持することで、キースレッド、スレッドのインスタンス内のその値です。インスタンスを取得するためのThreadLocal()方式を通じてスレッドを取得し、あなただけのスレッドでキーに必要な、あなたは地図から対応するインスタンスを見つけることができます。スキームを以下に示します。
プログラムは、各スレッド別のバックアップ上記の要件を満たすことができます。それぞれの新しいスレッドはThreadLocalのにアクセスするには、地図にマップを追加する必要があり、各スレッドの終了時に、マップをクリアする必要があります。ここでは、2つの問題があります。
- 糸と糸を増やす必要がスレッドの安全性を確保するためにマップスレッドセーフという、これより以下の必要性ロックを確保するため、マップの減少を書くために必要な
- スレッドの終了時に、必要性は、対応するマップが削除されているすべてのThreadLocalのそれ訪問は、それがメモリリークを引き起こす可能性があることを確認します。
(⭐️⭐️⭐️ JDK実装)スレッド・インスタンスとのマッピングを維持するのThreadLocal
複数のスレッドが同じマップにアクセスするため、上記の解決策では、問題は、ロックを表示されます。地図スレッドによって維持した場合、そのアクセスに各スレッドにのみ、自分の地図は、その後、マルチスレッドの問題を記述し、必要ロックが存在しないことは存在しません。スキームを以下に示します。
プログラムは、問題をロックしませんが、しかし、アクセスする各スレッドの後にThreadLocal変数は、自分の地図でThreadLocal変数と具体例のマッピングを維持しますので、あなたがこれらの参照(マップ)を削除しない場合、これらはThreadLocalをリサイクルすることはできませんこれは、メモリリークが発生することがありますが、JDKは、多くの方法(を通じて、この問題を解決するために:JDKが一時的に凝っていないメモリリークを防ぐために、どのようにTODO)
ThreadLocalのライフサイクル
TODO:細切り顔の質問にThreadLocal!!!場所の内側には、リサイクルの話します
ThreadLocalのアプリケーションシナリオ
上述したように、次の2つのシナリオにThreadLocalの適用(実際には、最初のシナリオに帰することができます)
- 各スレッドは、独自の個別のインスタンスが必要です
- また、スレッド内の別のインスタンスで構築することができるが、ThreadLocalの出会いは非常に便利な形で、この必要性。
- 例としては、複数の方法で共有する必要があるが、マルチスレッドで共有されないようにします
- 参照することによっても相互に実装される方法の形態が、それほどThreadLocalの結合コードで送達され得る、よりエレガント達成します。
⭐️⭐️⭐️⭐️実用的な応用例など。
- JavaのWebアプリケーションのセッションは、各スレッドが独自の個別セッションのインスタンスを持って、多くの場所では、セッションを操作する必要があります
- アンドロイドでは、ルーパークラスはThreadLocalの特性を使用することです
- シングルトンとシングルスレッドに格納された単一のスレッドコンテキスト情報を実装することは、そのようなトランザクションIDなどのような
- 各スレッドは、対応のインスタンスを持っているので、スレッドセーフを達成するため、非スレッドセーフオブジェクトは、使用ThreadLocalの後、スレッドセーフとなるであろう
- パラメータを渡す方法に往復避けるために、いくつかのスレッド関連データベアラ、
- 接続管理データベースは、各スレッドは、トランザクションに相当します
- 達成することがThreadLocalを、現在のスレッド操作は、そのトランザクションを確実にするために、同じ接続を使用しています
- Hibernateの接続管理も同じ技術を使用しています
- TODO:Javaの並行プログラミング:のThreadLocalの詳細な分析この記事データベースを比較するための2つの議論の方法を持っているが、まだ可能です
TODO:ThreadLocalMap、InheritableThreadLocal的理解