答案 0 :(得分:14)
例如,在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);
}
}
答案 1 :(得分:4)
他们是相关的。例如,在C#中,lock语句在完成后是entering a Monitor和exiting one的简单try-finally包装。
答案 2 :(得分:1)
监视器是编译器辅助的“半自动”锁。它们允许人们在类等上声明synchronized
方法。这只是提供互斥的不同方法。我发现this book是对这些概念的最彻底的解释,尽管它主要面向操作系统开发人员。
答案 3 :(得分:0)
锁可以确保相互排斥。
监视器将要保护的数据与保护数据访问所需的互斥和同步原语相关联。
例如使用同步。当你需要一个线程等待事件发生时(例如,等到另一个线程将一个项目放入队列中)。
答案 4 :(得分:0)
Monitors是一种编程语言结构,与semiphores / locks完全相同,但Monitors通过在运行时同步来控制共享数据。相比之下,锁只是通过“旋转”来保护共享数据,这可能导致CPU利用率低下。
答案 5 :(得分:0)
没有区别,lock在try / finally块中生成Monitor.Enter和Monitor.Exit。使用Monitor over lock可以微调,因为它有Pulse和PulseAll。如果您无法使用TryEnter获取锁定,也可以进行备用处理。
答案 6 :(得分:0)
据我到目前为止的研究,监视程序是一组用于线程同步的原理,而锁是与“线程合作”工具(如“等待”和“通知”)一起在Java中实现监视程序的方式。如此有效地,如果我们试图在两个概念之间形成确切的关系,则锁是监视器实现的一部分(另一个是等待和通知机制)。如果我错了,请纠正我,但是如果纠正非常具体,我将不胜感激。
答案 7 :(得分:-1)
只关注相互的冲动,但是 Moniter自动提供互斥。
因此我们不必担心在Monitor中使用互斥。 而不是ME,我们只有在编程时才需要保持同步。
Moniter提供更系统的编程方式。 因此,它是更先进的。
答案 8 :(得分:-1)
Monitor是概念,Lock是实际的实现。