我读到互斥锁是一个值为 1(二进制信号量)的信号量,用于强制互斥。
我读了这个链接
Semaphore vs. Monitors - what's the difference?
这表示监视器有助于实现互斥。
有人可以告诉我互斥锁和监视器之间的区别,因为它们都有助于实现相同的目标(互斥)吗?
请您参考如下方法:
不幸的是,教科书的定义并不总是与不同的平台和语言如何使用这些术语相对应。因此,要获得准确的答案,您必须指定平台和上下文。但总的来说:
一个 互斥锁 是一个锁,一次只能由一个线程拥有。锁本身并不保护任何东西,但代码可以检查互斥锁的所有权,以确保某些代码部分一次只能由单个线程执行。如果一个线程想要获得一个互斥锁,则该线程将被阻塞,直到它变得可用。
在 Java 术语中是 监控 是一个与对象隐式关联的互斥锁。当synchronized
关键字应用于类或方法 围绕代码创建隐式互斥锁,确保一次只有一个线程可以执行它。这称为监视器锁定或仅称为监视器。
所以在 Java 中,监视器不是一个特定的对象,而是任何对象都有一个可用的监视器锁,它通过 synchronized
调用。关键词。synchronized
关键字也可以用在代码块上,在这种情况下,要锁定的对象是明确指定的。这里有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。
在计算机科学教科书中,您可能会遇到不同类型的监视器,Brinch-Hansen 或 Hoare-monitor,它是隐式线程安全的类或模块(如 Java 中的同步类)并且具有多个线程可以等待的条件/信号开启。这是比 Java 监视器更高级别的概念。
C#/.NET 有类似于 Java 的监视器,但也有一个 Mutex
标准库中的类 - 这与监视器中使用的互斥锁不同。监视器锁只存在于单个进程中,而 Mutex
-lock 是机器宽的。因此,监视器锁适用于使对象和数据结构线程安全,但不适用于提供系统范围内对文件或设备的独占访问。
所以底线:这些术语可能意味着不同的东西,所以如果你想要一个更具体的答案,你应该指定一个特定的平台。