C#, C♯, C#相談室 Part91 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0488デフォルトの名無しさん
2016/12/11(日) 10:51:04.21ID:rgeKQ1h1Microsoft 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を呼び出している問に別のスレッドがプロパティに
アクセスする」ことがありえるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています