信号量:
计数信号量。从概念上讲,信号量维护一组许可证。
acquire()如果需要,每个块都会阻塞,直到获得许可为止,然后获得许可。每个都release()添加一个许可证,有可能释放阻止收购方。但是,没有使用实际的许可对象。信号量只是保持可用数量的计数并采取相应措施。
与无法访问某些(物理或逻辑)资源相比,信号量通常用于限制线程数
Java没有内置的Mutex API。但是可以将其实现为二进制信号量。
初始化为一个的信号灯可以用作互斥锁,该信号灯最多只能使用一个许可。这通常被称为二进制信号量,因为它只有两种状态:一个许可可用,或者零许可可用。
当以这种方式使用时,二进制信号量具有属性(与许多Lock实现不同),该“锁”可以由所有者以外的线程释放(因为信号量没有所有权概念)。这在某些特殊情况下(例如死锁恢复)很有用。
因此,信号量和互斥量之间的主要区别是:
-
信号量限制线程通过许可访问资源的数量。Mutex仅允许一个线程访问资源。
-
没有线程拥有信号量。线程可以通过调用
acquire()和release()方法来更新许可数量。互斥锁只能由持有锁的线程来解锁。 -
当互斥锁与条件变量一起使用时,会出现一个括号,即正在保护程序的哪个部分。信号量不一定是这种情况,可以将其称为并发编程。它功能强大,但以非结构化,不确定的方式易于使用。
信号量是一种同步机制,用于控制多个线程对资源的访问。它可以维护一个许可计数,线程通过acquire()获取许可,release()释放许可。二进制信号量作为互斥锁使用时,只允许一个线程访问资源,且可由其他线程释放,适合于死锁恢复。信号量不限制所有权,而互斥锁只能由拥有者解锁,且使用时需要明确保护的代码区域。
304

被折叠的 条评论
为什么被折叠?



