6

threadlocals 変数は、変数を所有するサーブレットに対して行われるすべての要求に対してグローバルですか?

サーバーにはレジンを使用しています。

アンサーありがとう。

自分のことをもっと明確にできると思います。

特定のケース:

したい:

  • リクエストが実行を開始するときに静的変数を初期化します。
  • リクエストが実行を終了するまで、スレッドセーフな方法でサーブレットから呼び出されたメソッドのさらなる実行で変数の値を照会できる
4

5 に答える 5

4

簡単な答え:はい。
もう少し長いもの:これはSpringがその魔法を行う方法です。RequestContextHolder(DocJar経由)を参照してください。

ただし、注意が必要です。ThreadLocalを無効にするタイミング、他のスレッドに延期する方法、および非スレッドローカルコンテキストに絡まる(しない)方法を知っておく必要があります。

または、Springを使用することもできます...

于 2008-12-17T13:17:58.267 に答える
3

Adielが言うように、これを行う適切な方法は、おそらくThreadLocalを作成するのではなく、要求コンテキスト(つまり、HttpServletRequest)を使用することです。ここでThreadLocalを使用することは確かに可能ですが、そうする場合はスレッドをクリーンアップするように注意する必要があります。そうしないと、スレッドを取得する次のリクエストで前のリクエストに関連付けられた値が表示されます。(最初の要求がスレッドで実行されると、スレッドはプールに戻るため、次の要求でそれが表示されます。)要求コンテキストがこの目的のために存在する場合、そのようなことを管理する必要はありません。

于 2008-12-17T03:55:34.050 に答える
3

それらは、その特定のスレッドのみで行われたすべてのリクエストに対してグローバルであると思います。他のスレッドは、スレッド ローカルデータの他のコピーを取得します。これがスレッド ローカル ストレージの重要なポイントです: http://en.wikipedia.org/wiki/Thread-local_storage#Java

サーブレット構成で適切なオプションをチェックしない限り、サーブレット コンテナは複数のスレッドでサーブレットを使用してリクエストを並行して処理します。したがって、クライアントにサービスを提供しているスレッドごとに個別のデータを持つことになります。

WebApplication が分散されていない (複数の Java 仮想マシンで実行されている) 場合は、ServletContextオブジェクトを使用して、要求とスレッド間で共有データを格納できます (その場合は、必ず適切なロックを行ってください)。

于 2008-11-26T18:58:31.470 に答える
0

スレッドローカル変数は常にグローバルにアクセスされるように定義されています。これは、どこからでもアクセスできるシステムの周囲に情報を透過的に渡すことがポイントであるためです。変数の値は、それが設定されているスレッドにバインドされているため、変数がグローバルであっても、アクセス元のスレッドによって異なる値を持つ可能性があります。

簡単な例は、リクエストがサーブレットで受信されたときに、スレッドローカル変数のスレッドにユーザーID文字列を割り当てることです。そのリクエストの処理チェーンのどこにいても(同じVMの同じスレッドにあると仮定して)、このグローバル変数にアクセスすることでIDを取得できます。スレッドはスレッドプールに戻されるため、要求の処理時にこの値を削除することも重要です。

于 2008-11-26T19:25:51.073 に答える