アプリがキャッシュされたスレッド プールを使用している場合でも、サーバー環境に展開していない場合は、スレッド ローカルで remove を呼び出す必要がありますか?
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
アプリがキャッシュされたスレッド プールを使用している場合でも、サーバー環境に展開していない場合は、スレッド ローカルで remove を呼び出す必要がありますか?
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
のjavadocにThreadLocal
よると:
... スレッドがなくなった後、そのスレッド ローカル インスタンスのすべてのコピーがガベージ コレクションの対象になります ...
スレッドがまだ残っている可能性があり、リソースを逆参照したい場合は、 を呼び出すことをお勧めしますremove()
。
クリアしたい場合は、単純なローカル変数の使用を検討することをお勧めします。
理論的には、Thread
との両方ThreadLocal
がまだ機能している場合、値に到達できます。いずれかが到達不能である場合、理論的には、参照されていない場合、値はガベージ コレクション可能です。ただし、OpenJDK にはバグがあり、値がThreadLocal
(驚くほど一般的な)を参照していて、Thread
まだ実行中の場合、リークします。
そうです、ある意味では、サーバー環境について特別なことは何もありません。ただし、一般的に、開発中にコードのリロードを繰り返している場合、ThreadLocal
値から値 (値から値のクラスへ、クラスのクラスローダーからすべてのクラスへ) に到達できる場合がよくあります。 -loaded-through-class-loader から static-fields-of-these-classes へThreadLocal
)。Java Beans と JDBC の実装にも同様の問題がある場合があります。