监视器与互斥锁
Monitor vs Mutex
我读到互斥量是一个值为 1 的信号量(二进制信号量),用于强制互斥。
我读了这个link
Semaphore vs. Monitors - what's the difference?
表示监视器有助于实现互斥。
谁能告诉我互斥锁和监视器之间的区别,因为两者都有助于实现相同的目的(互斥)?
既然你没有具体说明你说的是OS还是language/library,我就笼统的回答一下。
从概念上讲,它们是相同的。但通常它们的实现略有不同
监控
通常,监视器的实现是faster/light-weight,因为它是为同一进程内的多线程同步而设计的。此外,通常,它由 framework/library 本身提供(而不是请求 OS)。
互斥
通常,互斥量由 OS 内核提供,而 libraries/frameworks 只是提供一个接口来调用它。这使得它们 heavy-weight/slower,但它们在不同进程上跨线程工作。 OS 还可能提供按名称访问互斥锁的功能,以便在不同的可执行文件的实例之间轻松共享(而不是使用只能由 fork
使用的句柄)。
Monitor 与 Mutex 不同,但在某种意义上可以认为它们相似,Monitor 构建在 Mutex 之上。为清楚起见,请参阅底部图像中的监视器描述。
Monitor 是一种同步构造,它允许线程同时具有互斥(使用锁)和协作,即让线程等待特定条件为真(使用等待)的能力-set).
换句话说,除了实现锁的数据外,每个 Java 对象在逻辑上都与实现等待集的数据相关联。锁帮助线程在共享数据上独立工作而不会相互干扰,而等待集帮助线程相互合作以实现共同目标,例如所有等待的线程都将被移动到这个等待集中,一旦锁被释放,所有线程都会收到通知。这个等待集在锁的额外帮助下帮助构建监视器(mutex)。
你要,你看我的回答here,可能和这个问题不相关
你可以在这里找到另一个相关的讨论
Semaphore vs. Monitors - what's the difference?
遗憾的是,教科书定义并不总是与不同平台和语言使用术语的方式相对应。因此,要获得准确的答案,您必须指定平台和上下文。但总的来说:
A mutex 是一次只能由一个线程拥有的锁。锁本身不保护任何东西,但代码可以检查互斥量的所有权以确保代码的某些部分一次仅由单个线程执行。如果线程想要获取互斥锁,线程将被阻塞,直到它可用。
在Java 术语中,monitor 是一个与对象隐式关联的互斥锁。当 synchronized
关键字应用于 classes 或方法时,会在代码周围创建一个隐式互斥锁,以确保一次只有一个线程可以执行它。这称为监视器锁或监视器。
所以在 Java 中监视器不是一个特定的对象,而是 任何 对象都有一个可用的监视器锁,可以使用 synchronized
关键字调用。
synchronized
关键字也可以用在代码块上,在这种情况下要锁定的对象是明确指定的。这里有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。
在计算机科学教科书中,您可能会遇到另一种监视器,即 Brinch-Hansen 或 Hoare-monitor,它是一个 class 或隐含 thread-safe 的模块(就像 Java 中的同步 class)并且有多个条件线程可以 wait/signal on。这是一个 higher-level 概念,而不是 Java 监视器。
C#/.NET 有类似于 Java 的监视器,但在标准库中也有一个 Mutex
class - 这与监视器中使用的互斥锁不同。监视器锁只存在于单个进程中,而 Mutex
-lock 是机器范围的。因此,监视器锁适用于使对象和 data-structures 线程安全,但不适用于提供 system-wide 对文件或设备的独占访问。
所以底线:这些术语可能意味着不同的东西,所以如果你想要一个更具体的答案,你应该指定一个特定的平台。
我读到互斥量是一个值为 1 的信号量(二进制信号量),用于强制互斥。
我读了这个link Semaphore vs. Monitors - what's the difference? 表示监视器有助于实现互斥。
谁能告诉我互斥锁和监视器之间的区别,因为两者都有助于实现相同的目的(互斥)?
既然你没有具体说明你说的是OS还是language/library,我就笼统的回答一下。
从概念上讲,它们是相同的。但通常它们的实现略有不同
监控
通常,监视器的实现是faster/light-weight,因为它是为同一进程内的多线程同步而设计的。此外,通常,它由 framework/library 本身提供(而不是请求 OS)。
互斥
通常,互斥量由 OS 内核提供,而 libraries/frameworks 只是提供一个接口来调用它。这使得它们 heavy-weight/slower,但它们在不同进程上跨线程工作。 OS 还可能提供按名称访问互斥锁的功能,以便在不同的可执行文件的实例之间轻松共享(而不是使用只能由 fork
使用的句柄)。
Monitor 与 Mutex 不同,但在某种意义上可以认为它们相似,Monitor 构建在 Mutex 之上。为清楚起见,请参阅底部图像中的监视器描述。
Monitor 是一种同步构造,它允许线程同时具有互斥(使用锁)和协作,即让线程等待特定条件为真(使用等待)的能力-set).
换句话说,除了实现锁的数据外,每个 Java 对象在逻辑上都与实现等待集的数据相关联。锁帮助线程在共享数据上独立工作而不会相互干扰,而等待集帮助线程相互合作以实现共同目标,例如所有等待的线程都将被移动到这个等待集中,一旦锁被释放,所有线程都会收到通知。这个等待集在锁的额外帮助下帮助构建监视器(mutex)。
你要,你看我的回答here,可能和这个问题不相关
你可以在这里找到另一个相关的讨论
Semaphore vs. Monitors - what's the difference?
遗憾的是,教科书定义并不总是与不同平台和语言使用术语的方式相对应。因此,要获得准确的答案,您必须指定平台和上下文。但总的来说:
A mutex 是一次只能由一个线程拥有的锁。锁本身不保护任何东西,但代码可以检查互斥量的所有权以确保代码的某些部分一次仅由单个线程执行。如果线程想要获取互斥锁,线程将被阻塞,直到它可用。
在Java 术语中,monitor 是一个与对象隐式关联的互斥锁。当 synchronized
关键字应用于 classes 或方法时,会在代码周围创建一个隐式互斥锁,以确保一次只有一个线程可以执行它。这称为监视器锁或监视器。
所以在 Java 中监视器不是一个特定的对象,而是 任何 对象都有一个可用的监视器锁,可以使用 synchronized
关键字调用。
synchronized
关键字也可以用在代码块上,在这种情况下要锁定的对象是明确指定的。这里有点奇怪,因为您可以使用一个对象的监视器来锁定对另一个对象的访问。
在计算机科学教科书中,您可能会遇到另一种监视器,即 Brinch-Hansen 或 Hoare-monitor,它是一个 class 或隐含 thread-safe 的模块(就像 Java 中的同步 class)并且有多个条件线程可以 wait/signal on。这是一个 higher-level 概念,而不是 Java 监视器。
C#/.NET 有类似于 Java 的监视器,但在标准库中也有一个 Mutex
class - 这与监视器中使用的互斥锁不同。监视器锁只存在于单个进程中,而 Mutex
-lock 是机器范围的。因此,监视器锁适用于使对象和 data-structures 线程安全,但不适用于提供 system-wide 对文件或设备的独占访问。
所以底线:这些术语可能意味着不同的东西,所以如果你想要一个更具体的答案,你应该指定一个特定的平台。