我了解到互斥锁是一个值为1(二进制信号量)的信号量,用于实现互斥。
我阅读了这个链接Semaphore vs. Monitors - what's the difference? 其中提到监视器有助于实现互斥。
有人能告诉我互斥锁和监视器之间的区别吗?因为它们都可以实现相同的目的(互斥)。
我了解到互斥锁是一个值为1(二进制信号量)的信号量,用于实现互斥。
我阅读了这个链接Semaphore vs. Monitors - what's the difference? 其中提到监视器有助于实现互斥。
有人能告诉我互斥锁和监视器之间的区别吗?因为它们都可以实现相同的目的(互斥)。
由于您没有明确指定讨论的操作系统或语言/库,让我以一种通用的方式回答。
从概念上讲,它们是相同的。但通常它们的实现略有不同。
监视器
通常,监视器的实现更快/轻量级,因为它设计用于同一进程内的多线程同步。此外,通常它是由框架/库本身提供的(而不是请求操作系统)。
互斥锁
通常,互斥锁是由操作系统内核提供的,库/框架只提供调用接口。这使它们变得重量级/较慢,但它们可以跨不同进程的线程工作。操作系统还可能提供通过名称访问互斥锁的功能,以便轻松共享分离可执行文件的不同实例之间的锁(而不是使用仅可由fork
使用的句柄)。
监视器(Monitor)和互斥锁(Mutex)不同,但它们可以在某种程度上被认为是相似的,因为监视器是建立在互斥锁之上的。请参见底部图像中监视器的示例以获得更清晰的了解。
监视器是一种同步构造,允许线程同时具有互斥性(使用锁)和合作性,即使线程等待某些条件成立(使用等待集合)的能力。
换句话说,除了实现锁的数据外,每个Java对象都与实现等待集合的数据逻辑关联。而锁有助于线程在共享数据上独立地工作而不相互干扰,等待集则帮助线程彼此协作,共同努力实现共同目标,例如所有等待线程将移动到此等待集,并在释放锁时通知所有线程。这个等待集在使用锁(互斥锁)的情况下有助于构建监视器。
如果您愿意,可以在这里看到我的答案,该答案可能与此问题相关或不相关。
您可以在此处找到另一个相关讨论
synchronized
关键字调用的。
synchronized
关键字也可以用于一段代码块,在这种情况下,要明确指定要锁定的对象。这里变得有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。Mutex
类,在标准库中——这与监视器中使用的互斥锁不同。监视器锁仅存在于单个进程内,而Mutex
锁是全局性的。因此,监视器锁适用于使对象和数据结构线程安全,但不适用于提供系统范围内的独占访问,例如文件或设备。