监视器和锁的区别是什么?

11

一个monitor和一个lock有什么区别?

如果锁只是互斥实现的一种方式,那么监视器是否只是一种利用方法执行之间等待时间的方式?

一个好的解释会非常有帮助,谢谢....

敬礼

9个回答

14
例如在C# .NET中,锁语句等效于:
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
这个答案没有提供“锁”和“监视器”概念之间的动词形式关系。 - Martin

4
他们是相关的。例如,在C#中,lock语句是一个简单的try-finally包装器,用于在完成时进入监视器并退出监视器。请参考以下链接:lockentering a Monitorexiting one。请注意,HTML标签已保留。

你能用自己的话描述一下它们之间的关系吗? - Martin

1

监视器是编译器辅助的“半自动”锁。它们允许在类等上声明synchronized方法。这只是提供互斥的不同方法。我发现this book是最详尽的概念解释,尽管它主要面向操作系统开发人员。


0

监视器是一种编程语言结构,与信号量/锁执行相同的操作,但监视器通过在运行时进行同步来控制共享数据。相比之下,锁仅通过“自旋”来保护共享数据,这可能导致CPU利用率低下。


0

监视器是概念,锁是实际实现。


为什么这个答案得分为负数?评分人能否在评论中提供解释?因为从我目前看到的一切来看,没有人真正知道“锁定”概念和“监视器”概念之间的确切关系。每个人似乎都通过单独定义每个概念来避免这种关系,这并不能回答问题。这是我迄今为止找到的唯一具体答案:概念:“锁定”关系:“是”概念:“监视器”的实际实现。我读过的任何人都没有提供这种关系。 - Martin

0

在锁定方面,lock 与 Monitor.Enter 和 Monitor.Exit 的生成方式没有区别,它们都在 try/finally 块中。使用 Monitor 而不是 lock 可以让您进行微调,因为它具有 Pulse 和 PulseAll。如果无法获取锁定,则可以使用 TryEnter 进行备用处理。


0

锁定确保互斥。

监视器将要保护的数据和所需的互斥和同步原语相关联,以保护对数据的访问。
同步用于例如需要一个线程等待直到事件发生(例如,等待另一个线程将项目放入队列)的情况。


0
就我目前的研究而言,监视器是线程同步的一组原则,而锁定是Java中实现监视器的方式,与“线程协作”设施(如等待和通知)一起使用。因此,如果我们试图形成这两个概念之间的确切关系,锁定是监视器实现的一部分(另一部分是等待和通知机制)。如果我有错误,请纠正我,但我真的很感激纠正得非常具体。

-1
只锁定互斥,但监视器会自动提供互斥。
所以我们不需要担心在监视器中使用互斥。 在编程时,我们只需要关注同步而不是互斥。
监视器提供了更系统化的编程方式。 因此,它更先进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接