【发布时间】:2013-02-08 01:15:04
【问题描述】:
在.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)以确保释放监视器。
另一方面,在Monitors 的概览中有:
Visual Basic SyncLock 和 C# lock 语句使用 MonitorEnter 来获取锁,并使用 MonitorExit 来释放它。
上面的MonitorEnter指的是不同于之前版本的Enter方法,即:Enter(Object)
在 Visual Studio 2012 的 Thread Synchronization (C# and 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)? 到底怎么做有什么区别?
【问题讨论】:
-
他们都是真的。取决于您所针对的 .NET 版本。
-
@HansPassant:我只从 .NET 4.5 和 Visual Studio 2012 获得这些报价