Monitor.Enter(object);
try
{
// Your code here...
}
finally
{
Monitor.Exit(object);
}
请记住,Monitor也可以使用 Wait()
和Pulse()
方法,在复杂的多线程情况下通常很有用。
编辑: 在较新版本的.NET框架中,该内容已作出更改:
bool lockTaken = false;
try
{
Monitor.Enter(object, ref lockTaken);
// Your code here...
}
finally
{
if (lockTaken)
{
Monitor.Exit(object);
}
}
监视器是编译器辅助的“半自动”锁。它们允许在类等上声明synchronized
方法。这只是提供互斥的不同方法。我发现this book是最详尽的概念解释,尽管它主要面向操作系统开发人员。
监视器是一种编程语言结构,与信号量/锁执行相同的操作,但监视器通过在运行时进行同步来控制共享数据。相比之下,锁仅通过“自旋”来保护共享数据,这可能导致CPU利用率低下。
监视器是概念,锁是实际实现。
在锁定方面,lock 与 Monitor.Enter 和 Monitor.Exit 的生成方式没有区别,它们都在 try/finally 块中。使用 Monitor 而不是 lock 可以让您进行微调,因为它具有 Pulse 和 PulseAll。如果无法获取锁定,则可以使用 TryEnter 进行备用处理。
锁定确保互斥。
监视器将要保护的数据和所需的互斥和同步原语相关联,以保护对数据的访问。
同步用于例如需要一个线程等待直到事件发生(例如,等待另一个线程将项目放入队列)的情况。