春はclass A
の唯一のインスタンスオブジェクトを作成する(のがobjA
それを呼びましょう)と、そのオブジェクトの中に、スレッドローカル変数が存在します。 SpringはobjAをどのスレッドにも返さないが、スレッドはobjA
内のロジックを実行するか、またはobjA
に関連付けられたロジックを実行することに注意してください。
しかし、Threadlocal変数の値は、ロジックを実行しているスレッドだけが見ることができます。この場合もclass A
(objA
)の唯一のオブジェクトインスタンスは、各実行スレッドは、これらの変数は、各点でそれらの正常な対応物とは異なる、ThreadLocalのJavadocを記載
をスレッドローカル変数student
ための独自の価値を有するであろうがあります(その{@code GET}または{@codeセット}メソッドを経由して)1にアクセスし スレッド はここにあなたがInheritableThreadLocal
を使用し、そのに応じていることを変数
注独自の、独立して、初期化コピーを持っていますjava doc
このクラスは子スレッドに親スレッドから 値の継承を提供するためにThreadLocalを拡張します。子スレッドが作成さ あるとき、子供は親が値を持つすべての継承 スレッドローカル変数の初期値を受け取ります。
親スレッドでスレッドローカル値を設定すると、同じ値が子スレッドで使用できるようになります。ただし、子スレッドのスレッドローカル値は変更できますが、親スレッドのスレッドローカル値には影響しません。
スレッドローカルを使用する場合は注意してください。スレッドプールを使用している場合は、正しい時刻にスレッドのローカルをクリーンアップする必要があります。それ以外の場合、スレッドのローカルリークが発生します。
@Sajithが最後の文でも述べたことに注意を払う。このコードがWebサーバー上で実行されている場合、ほとんどすべてがスレッドプールを使用しているため、スレッドローカルには、最後のランダム要求が残っていた値が含まれます。その解決策にはServletFilterがあります。ServletFilterは、 'finally'ブロックの終了時にthrealocal変数をnullにリセットし、例外の際にも常に呼び出されるようにします。ここ は、これを行うフィルターの例です: https://github.com/Clay-Ferguson/meta64/blob/master/src/main/java/com/meta64/mobile/config/AppFilter.java –
感謝ヘッドアップのために。私は実際には、私はまだいくつかの学生のオブジェクトが新しいスレッドの呼び出しで以前のスレッドによって設定されて参照してください状況に走った。カスタムスレッドプールで@Asyncを使用するときに発生しました。私はそれのために地元のスレッドを取り除く。 – Harshana