5

一部のインスタンスを維持するために、クラスにスレッドローカル変数を定義しました。再帰的な方法を設定して取得します。リクエストが完了したときにthreadlocal変数をクリアできないことがあります(他のすべての方法で分析しました。threadlocalをクリアできません)。

私の質問は、リクエストごとにスレッドローカル変数をクリアしなかった場合、どうなりますか?影響は何ですか?

4

3 に答える 3

10

javadocによると:

スレッドがなくなると、スレッドローカルインスタンスのすべてのコピーがガベージコレクションの対象になります(これらのコピーへの他の参照が存在しない場合)。

たとえば、ここでの実装は、キーに弱参照を使用するHashTableによってサポートされています。この場合、キーはスレッドです。スレッドが終了すると、マップ内のエントリがガベージコレクションの対象になります。

ガベージコレクションは、システムがメモリスペースを使い果たし始めたときにのみ発生する可能性があります。ただし、この考慮事項はシステム内のすべてのオブジェクトに適用されます。オブジェクトの再利用が開始されるタイミングは、VM固有であり、調整の対象となるGCポリシーによって異なります。

これは、スレッドローカルの良い使い方と悪い使い方についての私の見解です。

  • 並行性の問題に対処することがポイントである場合は、スレッドローカルを使用することをお勧めします。たとえば、スレッドごとに1つのコピーを保持することにより、スレッドセーフではないオブジェクトの同期を回避します。または、並行性に関連する他の設計上の問題に対処するため。

  • 安価な方法でコールチェーンに「パラメータを渡す」ことがポイントである場合、それは悪いことです。コードをリファクタリングし、オブジェクトを通常のメソッドパラメーターとして呼び出しチェーンに渡す方がよいでしょう。

  • スレッドローカルを使用して、現在のリクエストなど、何らかの形式の「現在の」コンテキストを格納することは問題ありません。

于 2012-05-15T06:55:05.857 に答える
2

スレッドが終了すると、ThreadLocal エントリへの参照も終了するため、オブジェクト (他に参照がない場合) はガベージ コレクションされます。

スレッドが存続している限り、オブジェクトも存続します。

オブジェクトが長寿命であることに対する影響を評価する必要があります。

于 2012-05-15T06:18:15.683 に答える
0

メモリリークがあり、次にコードが呼び出されたときにThreadLocalがすでに設定されている可能性があります。ThreadLocalsは、ちょっとしたコードの臭いです。

于 2012-05-15T06:19:43.063 に答える