如果锁只是互斥的一种实现,那么监视器只是一种利用方法执行之间的等待时间的方法吗?
一个好的解释将非常有帮助谢谢....
问候
例如,在 C# .NET 中,lock 语句等效于:
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);
}
}
他们是相关的。例如,在 C# 中,lock语句是一个简单的 try-finally 包装器,围绕进入 Monitor并在完成后退出Monitor。
监视器是编译器辅助的“半自动”锁。它们允许synchronized
在类等上声明方法。这只是提供互斥的另一种方法。我发现这本书是对这些概念最彻底的解释,尽管它主要面向操作系统开发人员。
锁确保互斥。
监视器将要保护的数据与保护对数据的访问所需的互斥和同步原语相关联。
例如,当您需要一个线程等到事件发生时(例如,等到另一个线程将项目放入队列中)时,就会使用同步。
Monitors 是一种编程语言结构,其功能与半量/锁相同,但 Monitors 通过在运行时同步来控制共享数据。相反,锁只是通过“旋转”来保护共享数据,这会导致 CPU 利用率低下。
没有区别,lock 在 try/finally 块中生成 Monitor.Enter 和 Monitor.Exit。使用 Monitor over lock 可以进行微调,因为它具有 Pulse 和 PulseAll。如果您无法使用 TryEnter 获取锁,您还可以进行替代处理。
Monitor 是概念,Lock 是实际的实现。
就我目前所研究的而言,monitor 是一组线程同步的原则,而 lock 以及诸如 wait 和 notify 之类的“线程协作”设施是在 Java 中实现监视器的方式。如此有效,如果我们试图在这两个概念之间形成确切的关系,锁是监视器实现的一部分(另一个是等待和通知机制)。如果我错了,请纠正我,但如果更正非常具体,我将不胜感激。
锁定只关注互斥,Moniter 会自动提供互斥。
所以我们不用担心在 Monitor 中使用互斥。只有在我们进行编程时,我们才需要注意 sycronzing 而不是 ME。
Monitor 提供了更系统的编程方式。因此,它是更先进的一种。