- 495 名前:デフォルトの名無しさん mailto:sage [2016/12/11(日) 10:51:04.21 ID:rgeKQ1h1.net]
- 質問させてください。
Microsoft Press の「プログラミング.NET Framework 第2版」という本に、下記の記述があるのですが、 【【【【【引用ここから】】】】】 internal sealed class Transaction { private DateTime timeOfLastTransaction; // 最後にトランザクションが行われた時間を記録するフィールド public void PerformTransaction() { Monitor.Enter(this); // thisオブジェクトのロックを取得 // トランザクションを実施... timeOfLastTransaction = DateTime.Now; // 直前のトランザクションの時間を記録 Monitor.Exit(this); // thisオフジエクトのロックを開放 } public DateTime LastTransaction { // 最後にトランザクションが行われた時間を返す読み取り専用プロパティ get { Monitor.Enter(this); // thisオブジ工クトのロックを取得 DateTime dt = timeOfLastTransaction; // 最近のトランザクションの時間を一時変数に保存 Monitor.Exit(this); // thisオブジェク卜のロックを開放 return dt; // 保存された日時を返す } } } 【【【【【中略】】】】】 プロパティの実装でEnterとExitと一時変数dtが必要なことに注意してください。 破壊されている可能性のある値を返さないようにするために、これが重要です。 あるスレッドがPerformTransactionを呼び出している問に別のスレッドがプロパティにアクセスすると、これが起こりえます。 【【【【【引用ここまで】】】】】 Monitorでロックをしてるのに、なぜ「あるスレッドがPerformTransactionを呼び出している問に別のスレッドがプロパティに アクセスする」ことがありえるのでしょうか?
|

|