次のような状況があります: オブジェクトへのアクセスを相互に除外したい。
これまでのところ、通常はロックオブジェクトを使用します
object lockObject = new object();
...
method1: lock(lockObject) { CODE1 }
現在、別のスレッドから呼び出すことができるメソッドもあります。不明な時間ブロックされるべきではなく、定義された時間内に応答する必要があります。
この場合、次のようなモニターを使用します
method2:
try{
Monitor.TryEnter(lockObject , 20000, ref lockTaken);
if (lockTaken) {CODE2}
}
catch(...){...}
finally
{
if (lockTaken) Monitor.Exit(timerLock);
}
ここで私の質問は次のとおりです。ロックオブジェクトが同じで相互に排除している場合、ロックとモニターをこのように混在させることができますか、またはすべてのロックをモニターに変更する必要がありますか?
それで、同じトークンが両方とも「ロック」されますか、それともモニターはオブジェクトの別のトークンを作成してからロックしますか?
一見すると、アプリケーションが両方のコードで同時に実行されていることがわかりません。しかし、CODE1 と CODE2 が並行して実行されるタイミングの問題が存在する可能性があるかどうかはわかりません。