2010-12-29 8 views
0

普通のクラスでは1つのスレッドからアクセスできるように設計されており、多くのスレッドが同時に1つのインスタンスを使用できるようにしたい。静的にし、locksを使用して、いくつかのクラスレベルのメソッドと変数を作成し、それらをthread-safeにします。ローカル変数を使用する方法(デフォルトでは、各スレッドにはスタックがあります)もあります。ThreadLocalを使ってスレッドセーフな通常のクラスを作成する<T>

私の質問は、古いクラスのpropertiesです。より一般的には、non-staticという変数です。私は単にThreadLocal<T>を使用することができ、各スレッドはpropertiesという独自のセットを持っていますか?確かにlocksと他のthread-safetyの問題がsetters(私はgettersが安全であると仮定します)の内部で使用します。

ThreadLocal<T>のパフォーマンスキラーですか?

+1

このクラスが何をしているのか、また複数のスレッドからの干渉がある理由を説明することなく、誰もあなたに良い答えを与えることはできません。 – Anon

+2

ThreadLocalは正確に何を信じていますか?私はそれがあなたが思っていることはしないと思うので。スレッドローカルストレージが正しいソリューションだと思う理由を説明できますか? –

+0

@Eric:スレッドにローカルな変数を読んでいます。したがって、実行スレッド数と同じ数のプロパティがあります。したがって、オブジェクトはスレッドごとに状態を持つことができます。 – Xaqron

答えて

1

これは実際にはスレッドのローカルではありません。各スレッドが独自のデータを持つ場合に使用します。

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

+0

またはConcurrenthashMap;) –

+0

誰かが質問タグ(編集済み)に 'Java'を追加しました。これは 'C#'クラスです。 – Xaqron

2

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

java.util.concurrentパッケージには、あなたを助けるかもしれないクラスがたくさんあります。スレッドセーフなコードを書くのは難しいので、そのテーマについて良い本を得ることをお勧めします。 Brian Goetzの "Java Concurrency in Practice"はかなり良いです。

+0

thisPostUpvotes ++; – Rekin

+0

誰かが質問タグにJavaを追加しました(編集済み)。これはC#クラスです。 – Xaqron

+0

ああ。さて、あなたがJavaで何かをするなら、記憶のことを覚えておいてください。 –

関連する問題