4

スレッドローカルとそれが役立つシナリオについて読んでいます。コンセプトは気に入っていますが、クローンとどう違うのだろうと思っていました。

したがって、スレッドローカルは変数の新しいコピーを返します。つまり、同期を使用する必要はありません。良い例は、スレッド セーフではない SimpleDateFormat オブジェクトで、ThreadLocal が適切な使用方法を提供します。しかし、単純に varibale use clone の新しいコピーを作成できないのはなぜでしょうか?

クローン作成と比較して、ThreadLocal クラスによって提供される付加価値は何ですか?

4

3 に答える 3

8

ThreadLocalは、同期またはスレッドセーフなオブジェクト アクセスに代わるものではありません同じオブジェクトが異なるスレッドから ThreadLocal に割り当てられた場合、プログラムは以前よりもスレッドセーフではなくなります同じオブジェクトが異なるスレッド間で引き続き共有されます。

ThreadLocal は変数のように機能します。つまり、オブジェクトを「命名」または「参照」します。

[ ThreadLocal ] はスレッド ローカル変数を提供します [.. そのようなもの] (その get または set メソッドを介して) 変数にアクセスする各スレッドは、独自の、独立して初期化された変数のコピーを持ちます。

つまり、ThreadLocal が行うことは、同じ ThreadLocalオブジェクトを使用するスレッド間の get/set 分離を提供することです。したがって、各スレッドは独自の異なるオブジェクトを ThreadLocal に割り当て/取得できます。ただし、これには、最初にさまざまなオブジェクトを割り当てるために「クローン」または新しいインスタンス化が必要です!

代入 (またはメソッド呼び出し)は、オブジェクトの暗黙的なクローン/コピー/複製を作成することはありません。これは ThreadLocal にまで及びます。

于 2013-01-20T07:24:04.053 に答える
7

ThreadLocal を使用すると、それ以上のチェックを行う必要なく、スレッドと同じ数の変数を作成できます。ただし、ストレージ自体はスレッドセーフを保証しないことに注意してください。ローカル ストレージに保存されている各オブジェクトがそのスレッドからのみ使用されるようにする必要があります。

オブジェクトを手動で複製する場合は、使用するたびにオブジェクトを複製するか、現在のスレッドを確認してから複製する必要があります。

また、クローン操作はスレッドセーフですか? 2 つの異なるスレッドがオブジェクトのクローンを作成しようとするとどうなりますか? 実際にはわかりませんが、良い習慣にはならないと思います。

于 2013-01-20T07:06:45.003 に答える
0

ThreadLocal を使用する方が高速です。ThreadLocal に格納されている SimpleDateFormat インスタンスは同じスレッドで複数回再利用できますが、複製は毎回新しいオブジェクトを作成することを意味します。

于 2013-01-20T07:21:58.830 に答える