.NET Framework 4.5 のMonitorドキュメントで、 lock キーワードが Monitor のEnter(Object, Boolean)メソッドを使用するという文を見つけました。
Enter メソッドと Exit メソッドによって提供される機能は、C# の lock ステートメント (Visual Basic では SyncLock) によって提供される機能と同じですが、lock と SyncLock が Enter(Object, Boolean) メソッドのオーバーロードと Exit メソッドを try…finally でラップする点が異なります。ブロック (Visual Basic では Try…Finally) を使用して、モニターが確実に解放されるようにします。
一方、モニターの概要には次のようなものがあります。
Visual Basic の SyncLock および C# のロック ステートメントでは、MonitorEnter を使用してロックを取得し、MonitorExit を使用して解放します。
上記の MonitorEnter は、以前とは異なるバージョンの Enter メソッドを参照しています。つまり、Enter(Object)
Visual Studio 2012のスレッド同期 (C# および Visual Basic)には、ロックがモニターをラップする方法のサンプルがあります。
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
Enter(Object)版もあります。
何が本当?lock ステートメントはEnter(Object, Boolean)またはEnter(Object)を呼び出しますか? 実際のやり方に違いはあるのでしょうか。