2011-12-09 8 views
1

私は異なるコンテキストで使用されるdifferntオブジェクトのリストを2つ持っています。各リストは複数のスレッドによってアクセスされ、リスト内のオブジェクトの状態を追加、削除、変更することができます。両方のリストは、リスト上でロックすることによって複数のアクセスから保護されます。それはうまく見える。
特定のプロパティ(異なるスレッドによってWRITENを取得する)を読み込むために、List1のオブジェクトがList2のオブジェクトへの参照を保持するという要件があります。
各リスト(およびそれに含まれるオブジェクト)はそれぞれ複数のアクセスから保護されていますが、List2 Object2.Object1.Propertyを介して別のスレッドがListItemを読み込んでいる間に、あるスレッドがList1 Object1.Propertyに書き込むことが可能になりました。
この状況は安全ですか? (私はそうは思わないが、100%確実ではない)。
安全でない場合 - 安全にするにはどうすればよいですか?スレッドの問題:ダブルリスト - 相互参照を導入する

答えて

1

次に、あなたが書かれたオブジェクトに直接ロックを適用する必要があります。 'Property'を変更する前にObject1をロックすると、スレッドがObject1.PropertyまたはObject2.Object1.Propertyを使用していても問題なく動作します。

ロックされていないスレッドセーフであるかどうかは、プロパティの種類と変更方法によって異なります。読み取り/書き込み操作は、32ビット長のデータ(intや参照など)ではスレッドセーフです。しかし、あなたの操作は複数の読み取り/書き込みが必要な場合があります。

Object.IntProperty = 3; // Write-only on a 32bit value, thread-safe 
Console.WriteLine(Object.IntProperty); // Read-only on a 32bit value, thread-safe 
Object.IntProperty++; // Read + Write, not thread-safe. Requires locking 
+0

プロパティはDateTimeです - 書き込みをロックするだけで十分ですか? – Ricibob

+0

DateTimeは不変なので、大丈夫です。 –

1

それはまた、あなたがアクセスしているオブジェクトをロックすることは理にかなって:

Object myObject = list.get(x); 
lock(myObject){ 

// do stuff in here 

} 
1

あなたはforeachのと、他のスレッドでリストを反復処理している場合はアイテムを追加または削除し、あなたのforeachのは失敗します例えばので、安全ではありません。

最も簡単なオプションは、リストをSynchronizedCollection<T>に変更することです。詳細情報here

+0

+1 SyncronizedCollectionの場合はすぐにはわかりませんが、これはスレッドセーフでどの程度までですか?また、シンクルートに自分自身をロックする必要がある場合は - とにかく私はもっと詳しく見ていきます。 – Ricibob

関連する問題