0

thread-safe単一のスレッドがアクセスするように設計された通常のクラスがあり、多くのスレッドが同時に単一のインスタンスを使用できるようにしたいと考えています。いくつかのクラス レベルのメソッドと変数があり、静的にしてlocksmake それらを使用しますthread-safe。また、ローカル変数のみを使用するメソッドはデフォルトで安全です (各スレッドにはスタックがあります)。

私の質問propertiesは、古いクラス、またはより一般的には任意のnon-static変数についてです。単純に使用できThreadLocal<T>、各スレッドには独自のセットがありpropertiesますか? 確かに私は内部locksで他の問題を使用します(私は安全だと思います)。thread-safetysettersgetters

そして、ThreadLocal<T>パフォーマンスキラーですか?

4

2 に答える 2

2

ゲッターはあなたが思っているほど安全ではありません。Java メモリ モデルでは、各スレッドに独自のヒープ ビューが与えられるため、変数へのアクセスを同期しないと、スレッドが古いデータを読み取る可能性があります。変数を作成するvolatileと、古い読み取りが防止され、プリミティブには問題ありvolatileませんが、アクセスがアトミックにはなりません。

java.util.concurrentパッケージには、あなたを助けるかもしれないクラスがたくさんあります。スレッドセーフなコードを書くのは難しいので、この件に関する良い本を手に入れることをお勧めします。Brian Goetz の「Java concurrency in practice」はかなり良いです。

于 2010-12-29T21:27:21.517 に答える
1

それは実際にはスレッドローカルの目的ではありません。これらは、各スレッドが独自のデータを持つ場合を対象としています。

あなたの場合、フィールド タイプをに変更し、toMap<Object, Object>を使用Collections.synchronizedMapしてスレッド セーフにすることをお勧めします。

于 2010-12-29T21:17:33.867 に答える