どのようにThreadLocalの回復値、および時に回復?

1)ThreadLocalをどのように値をリサイクルする、とするとき、回復?
分析の内部型からのThreadLocal:

静的 クラスThreadLocalMap { 

  / ** 

         *このハッシュマップのエントリが使用して、弱い参照を拡張

         *(常にキーとしてその主REFフィールド

         * ThreadLocalのオブジェクト)。そのnullキー(すなわちentry.get()に注意してください

         * == null)をキーは、もはや参照され、そのことを意味しません

         *エントリがテーブルから抹消することができます。そのようなエントリが参照される

         以下のコードで「古いエントリ」として、*。

         * / 

   ... 

}

ThreadLocalMapは、カスタムハッシュマップはスレッドローカル値を維持するためにのみ適用されています。キーとしてweakreferencesを使用して、ハッシュテーブルエントリの使用の非常に大規模で長期の使用に対処するには。しかし、無参照キューいるので、これだけのテーブルだけで時代遅れのエントリを削除確保するために、スペースが不足し始めたとき。(ソースコードのコメントを)

②   

 静的 クラスエントリ延び弱い参照<ThreadLocalの<?>> { 

 / ** このThreadLocalの関連付けられた値。* / 

       Object値。

     エントリ(ThreadLocalの <?> K、オブジェクトV){ 

                スーパー(K)。
 = V; 

            } 

}

(注記:値が弱参照はない)をキーとしてThreadLocalの弱参照を使用してThreadLocalMap、キーのみ異なるスレッドに分離変数のアクセスを可能にする、ThreadLocalのオブジェクトとすることができます。強い参照を失うThreadLocalの場合は、のみ、次のGCの前にライフサイクルにエントリキーがnullに表示されますThreadLocalMap、この時間を生き残ることができ、現在のスレッドが終了することはできません、null値を入力するためのこれらのキーは常に強い存在します参照は、メモリリークが生じる、チェーン。
ソリューション:
推奨事項は()を取得するのThreadLocalの呼び出しでプライベート静的ThreadLocal変数として定義され、完全なセット()メソッドは、手動でのThreadLocalを削除する必要がもはや、()メソッドを削除呼び出します。

2)ThreadLocalのはなぜダーティデータのでしょうか?
スレッドプールは、わずか1つのマイナス面の二重の利点であるので:
スレッドがスレッドプールから削除され、それが再利用される場合は、最後に前回このスレッドということを確認する必要があり、その関連会社ThreadLocalのは、そうでなければ、次の使用まで育成し、一掃されます。

おすすめ

転載: www.cnblogs.com/1693977889zz/p/11111568.html
おすすめ