2017-11-26 12 views
0

私はデフォルトシングルトンスコープのBeanを持っています。このBeanは多くのスレッドからのアクセスで、私は生徒オブジェクトを各スレッド固有にします。私は休憩付きのスプリングブートを使用していますThreadLocal変数bahaviorを持つシングルトンBean

このような実装では、シングルトンBeanはどのスレッドとは異なるスレッドによって設定された生徒オブジェクトをどのように扱いますか。 Springは同じスレッドを返しますが、学生変数のオブジェクト値をカスタマイズしていますか?

@Service 
class A{ 

private InheritableThreadLocal<Student> student; 

} 

答えて

1

春はclass Aの唯一のインスタンスオブジェクトを作成する(のがobjAそれを呼びましょう)と、そのオブジェクトの中に、スレッドローカル変数が存在します。 SpringはobjAをどのスレッドにも返さないが、スレッドはobjA内のロジックを実行するか、またはobjAに関連付けられたロジックを実行することに注意してください。

しかし、Threadlocal変数の値は、ロジックを実行しているスレッドだけが見ることができます。この場合もclass AobjA)の唯一のオブジェクトインスタンスは、各実行スレッドは、これらの変数は、各点でそれらの正常な対応物とは異なる、ThreadLocalのJavadocを記載

をスレッドローカル変数studentための独自の価値を有するであろうがあります(その{@code GET}または{@codeセット}メソッドを経由して)1にアクセスし スレッド はここにあなたがInheritableThreadLocalを使用し、そのに応じていることを変数

注独自の、独立して、初期化コピーを持っていますjava doc

このクラスは子スレッドに親スレッドから 値の継承を提供するためにThreadLocalを拡張します。子スレッドが作成さ あるとき、子供は親が値を持つすべての継承 スレッドローカル変数の初期値を受け取ります。

親スレッドでスレッドローカル値を設定すると、同じ値が子スレッドで使用できるようになります。ただし、子スレッドのスレッドローカル値は変更できますが、親スレッドのスレッドローカル値には影響しません。

スレッドローカルを使用する場合は注意してください。スレッドプールを使用している場合は、正しい時刻にスレッドのローカルをクリーンアップする必要があります。それ以外の場合、スレッドのローカルリークが発生します。

+1

@Sajithが最後の文でも述べたことに注意を払う。このコードがWebサーバー上で実行されている場合、ほとんどすべてがスレッドプールを使用しているため、スレッドローカルには、最後のランダム要求が残っていた値が含まれます。その解決策にはServletFilterがあります。ServletFilterは、 'finally'ブロックの終了時にthrealocal変数をnullにリセットし、例外の際にも常に呼び出されるようにします。ここ は、これを行うフィルターの例です: https://github.com/Clay-Ferguson/meta64/blob/master/src/main/java/com/meta64/mobile/config/AppFilter.java –

+0

感謝ヘッドアップのために。私は実際には、私はまだいくつかの学生のオブジェクトが新しいスレッドの呼び出しで以前のスレッドによって設定されて参照してください状況に走った。カスタムスレッドプールで@Asyncを使用するときに発生しました。私はそれのために地元のスレッドを取り除く。 – Harshana

関連する問題