私は異なるコンテキストで使用されるdifferntオブジェクトのリストを2つ持っています。各リストは複数のスレッドによってアクセスされ、リスト内のオブジェクトの状態を追加、削除、変更することができます。両方のリストは、リスト上でロックすることによって複数のアクセスから保護されます。それはうまく見える。
特定のプロパティ(異なるスレッドによってWRITENを取得する)を読み込むために、List1のオブジェクトがList2のオブジェクトへの参照を保持するという要件があります。
各リスト(およびそれに含まれるオブジェクト)はそれぞれ複数のアクセスから保護されていますが、List2 Object2.Object1.Propertyを介して別のスレッドがListItemを読み込んでいる間に、あるスレッドがList1 Object1.Propertyに書き込むことが可能になりました。
この状況は安全ですか? (私はそうは思わないが、100%確実ではない)。
安全でない場合 - 安全にするにはどうすればよいですか?スレッドの問題:ダブルリスト - 相互参照を導入する
1
A
答えて
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
1
それはまた、あなたがアクセスしているオブジェクトをロックすることは理にかなって:
Object myObject = list.get(x);
lock(myObject){
// do stuff in here
}
1
関連する問題
- 1. 相互参照
- 2. Playの相互参照フィールド
- 3. SQLの相互参照テーブルデータ
- 4. 相互参照表の列
- 5. 相互参照リストのインデックス
- 6. Javascriptオブジェクトが相互参照する
- 7. CouchDB ACL相互参照ドキュメント
- 8. c#クローン相互参照リスト
- 9. Clojureの相互参照を参照する
- 10. postgreSQLの相互参照ですか?
- 11. Rbookdownに相互参照を入れる方法は?
- 12. 相互参照されたインターフェイスに問題がありますか?
- 13. 相互参照による在庫インベントリ
- 14. 相互参照XMLファイルのマージ
- 15. 2つのテーブル間の相互参照
- 16. ガベージコレクションの参照カウントメソッドにおける相互参照を理解する
- 17. gcc:相互参照クラスのコンパイル
- 18. ファミリーツリーの相互参照Prologルール
- 19. knitr/pandoc:セクションへの相互参照、サブセクション
- 20. jQuery/Dojo、UI/Dijit相互参照?
- 21. プロジェクト構造 - 相互参照レイヤー
- 22. 単一データ入力からの相互参照構造
- 23. ListInstance導入ガイドの問題
- 24. mySQL複数相互参照選択クエリ
- 25. linuxモジュール相互機能参照
- 26. PowerDesigner(データベース設計) - 相互参照テーブルにPKを追加する
- 27. JSF2マネージドBean参照問題:CDI注入?
- 28. 列車の時刻表データベースを相互参照する
- 29. パラメータの型を相互参照する方法
- 30. 既存のdoxygenドキュメントを相互参照する方法は?
プロパティはDateTimeです - 書き込みをロックするだけで十分ですか? – Ricibob
DateTimeは不変なので、大丈夫です。 –