监视器与互斥锁

54

我了解到互斥锁是一个值为1(二进制信号量)的信号量,用于实现互斥。

我阅读了这个链接Semaphore vs. Monitors - what's the difference? 其中提到监视器有助于实现互斥。

有人能告诉我互斥锁和监视器之间的区别吗?因为它们都可以实现相同的目的(互斥)。

3个回答

49

由于您没有明确指定讨论的操作系统或语言/库,让我以一种通用的方式回答。

从概念上讲,它们是相同的。但通常它们的实现略有不同。

监视器

通常,监视器的实现更快/轻量级,因为它设计用于同一进程内的多线程同步。此外,通常它是由框架/库本身提供的(而不是请求操作系统)。

互斥锁

通常,互斥锁是由操作系统内核提供的,库/框架只提供调用接口。这使它们变得重量级/较慢,但它们可以跨不同进程的线程工作。操作系统还可能提供通过名称访问互斥锁的功能,以便轻松共享分离可执行文件的不同实例之间的锁(而不是使用仅可由fork使用的句柄)。


2
看起来在性能方面完全相反:http://japgolly.blogspot.bg/2012/04/ruby-mutex-reentrancy.html - akostadinov
1
@akostadinov 我不懂 Ruby,不能对此发表评论。甚至我都不确定用于此基准测试的代码是否可靠。也许 Ruby 是我所提出的一般性声明中的异常情况?Joseph Albahari 撰写了一个关于 C# 中锁定构造的比较,似乎更符合我的说法。链接在此:http://www.albahari.com/threading/part2.aspx#_Locking - Vikhram
没有注意到这个问题不是关于Ruby的。奇怪,但我对这种奇怪的事情并不感到惊讶...我的意思是关于Ruby与其他任何东西的行为差异。 - akostadinov
你对互斥锁的定义听起来像是以前被称为信号量的东西... - Gerry

14

监视器(Monitor)和互斥锁(Mutex)不同,但它们可以在某种程度上被认为是相似的,因为监视器是建立在互斥锁之上的。请参见底部图像中监视器的示例以获得更清晰的了解。

监视器是一种同步构造,允许线程同时具有互斥性(使用锁)和合作性,即使线程等待某些条件成立(使用等待集合)的能力。

换句话说,除了实现锁的数据外,每个Java对象都与实现等待集合的数据逻辑关联。而锁有助于线程在共享数据上独立地工作而不相互干扰,等待集则帮助线程彼此协作,共同努力实现共同目标,例如所有等待线程将移动到此等待集,并在释放锁时通知所有线程。这个等待集在使用锁(互斥锁)的情况下有助于构建监视器。

enter image description here

如果您愿意,可以在这里看到我的答案,该答案可能与此问题相关或不相关。

您可以在此处找到另一个相关讨论

Semaphore vs. Monitors - what's the difference?


10
很遗憾,教科书上的定义并不总是与不同平台和编程语言使用的术语相对应。因此,要获得精确的答案,您必须指定平台和上下文。但是一般而言:
一个互斥锁(mutex)是一种锁,每次只能被一个线程占用。这个锁本身没有保护任何东西,但代码可以检查互斥锁的所有权,以确保某些代码只能由一个线程执行。如果一个线程想要获取互斥锁,则该线程将被阻塞,直到它变为可用。
在Java术语中,监视器(monitor)是一个隐式关联对象的互斥锁。当应用于类或方法时,会创建围绕代码的隐式互斥锁,从而确保每次只能有一个线程执行它。这称为监视器锁或仅称为监视器。
因此,在Java中,监视器并不是特定的对象,而是任何对象都有一个可用的监视器锁,它是通过synchronized关键字调用的。 synchronized关键字也可以用于一段代码块,在这种情况下,要明确指定要锁定的对象。这里变得有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。
在计算机科学教科书中,您可能会遇到一种不同类型的监视器,即Brinch-Hansen或Hoare监视器,它是一个隐含线程安全的类或模块(类似于Java中的同步类),并且具有多个条件可以使线程等待/发出信号。这比Java监视器是一个更高级别的概念。
C#/.NET有与Java类似的监视器,但还有一个Mutex类,在标准库中——这与监视器中使用的互斥锁不同。监视器锁仅存在于单个进程内,而Mutex锁是全局性的。因此,监视器锁适用于使对象和数据结构线程安全,但不适用于提供系统范围内的独占访问,例如文件或设备。
因此,总之:这些术语可能意味着不同的事情,因此如果您想要更具体的答案,您应该指定特定的平台。

2
据我所知,监视器是互斥锁和一个或多个条件变量的组合。 - pveentjer
@pveentjer:是的,那是Brinch-Hansen/Hoare监视器,与Java监视器不同。 - JacquesB
4
据我所知,Java监视器也是互斥锁和一个条件变量的组合。 - pveentjer

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