3

私はまだThreadLocalの概念について混乱しています。JavaDocや、このあたりに投稿されたその他の関連する質問を読みましたが、専門用語が使用されていて、すべてがあまり役に立ちませんでした。

私はThreadLocalのアイデアを理解しています。つまり、各スレッドには変数の独自のコピーがあります。それで...これは言うこととどう違うのですか...毎回新しい変数を作成しますか?

たとえば、DateFormatterを例として使用します。

public void convertDate(String date) 
{ 
    // Contruct new date formatter for every invocation of the method.
    DateFormatter df = new SimpleDateFormatter(...);
    ....
}

public void convertDate(String date) 
{ 
    // Getting date formatter from threadlocal.
    DateFormatter df = threadLocal.get();
    ....
}

2番目の変数が変数の新しいコピーを返すだけの場合、最初の変数は2番目の変数とどのように異なりますか?

ありがとう。

4

3 に答える 3

10

ThreadLocalオブジェクトは通常静的です。つまり、同じスレッド内の関数呼び出し間で値が保持されます。

最初のコードスニペットでは、が呼び出されるたびconvertDateに、新しいSimpleDateFormatterオブジェクトが作成されます。2番目のスニペットでは、SimpleDateFormatterスレッドごとに1つのオブジェクトが作成されます。同じスレッド内で呼び出されるget()たびに、同じオブジェクトがメソッドによって返されます。convertDate

ThreadLocalオブジェクトは、スレッドローカルストレージの実装に役立ちます。つまり、スレッドごとに変数の個別のインスタンスを維持することを意味します。

于 2009-05-17T01:33:06.793 に答える
1

の使用法はいくつかありますThreadLocal

あなたの例のように、構築するのに費用がかかり、スレッドセーフでないオブジェクトをキャッシュすることができます。オブジェクトは、使用するたびに構築のオーバーヘッドなしで安全な方法で使用できます。それは必ずしも勝利ではありませんが(たとえば、非ローカルメモリが使用されます)、勝利する可能性があります。

また、コンテキスト引数を介して、コンテキストを持つように設計されていないコールバックに「スリーズ」するために使用することもできます。または、インターフェイスを単純化するためだけに。この場合、への正規の参照ThreadLocalはおそらく静的ではありません。オブジェクトは意図的に変更可能にすることもできます。私はこのテクニックを奨励することはあまり好きではありませんが、一部の人々(「クレイジー」なボブ・リーなど)はそれを気に入っています。

ThreadLocalタスクを複数のスレッドにフォークする場合は、あまりうまく機能しません。InheritableThreadLocal良い使い方はないようです。

于 2009-05-17T02:01:22.967 に答える
1

2番目のメソッドが毎回異なるスレッドで呼び出される場合、2つの例は同じです。この場合、最初の例の方が効率的です。

ただし、同じスレッドで同じメソッドを複数回呼び出すと、そのスレッドの値がキャッシュされ、毎回新しいオブジェクトを作成する必要がなくなります。(日付に関連するオブジェクトのほとんどはかなり高価ですが、その場合は実行する価値があります)この場合、スレッドで同じオブジェクトを再利用することには、パフォーマンス上のわずかな利点があります。

注:スレッドローカルオブジェクトは、スレッド自体にアタッチされたマップに格納されています。スレッドが停止すると、そのスレッドにローカルなすべてのオブジェクトがGCされます。これは、ThreadLocalがほとんどのキャッシュよりも単純になる可能性がある場所です。

于 2009-05-17T05:33:36.737 に答える