5

アプリがキャッシュされたスレッド プールを使用している場合でも、サーバー環境に展開していない場合は、スレッド ローカルで remove を呼び出す必要がありますか?

public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
    public Integer initialValue(){return 3;}
};
4

2 に答える 2

5

javadocにThreadLocalよると:

... スレッドがなくなった後、そのスレッド ローカル インスタンスのすべてのコピーがガベージ コレクションの対象になります ...

スレッドがまだ残っている可能性があり、リソースを逆参照したい場合は、 を呼び出すことをお勧めしますremove()


クリアしたい場合は、単純なローカル変数の使用を検討することをお勧めします。

于 2012-11-06T18:40:38.163 に答える
2

理論的には、Threadとの両方ThreadLocalがまだ機能している場合、値に到達できます。いずれかが到達不能である場合、理論的には、参照されていない場合、値はガベージ コレクション可能です。ただし、OpenJDK にはバグがあり、値がThreadLocal(驚くほど一般的な)参照していて、Threadまだ実行中の場合、リークします。

そうです、ある意味では、サーバー環境について特別なことは何もありません。ただし、一般的に、開発中にコードのリロードを繰り返している場合、ThreadLocal値から値 (値から値のクラスへ、クラスのクラスローダーからすべてのクラスへ) に到達できる場合がよくあります。 -loaded-through-class-loader から static-fields-of-these-classes へThreadLocal)。Java Beans と JDBC の実装にも同様の問題がある場合があります。

于 2012-11-06T18:52:09.797 に答える