java - 二进制信号量与可重入锁

标签 java multithreading semaphore

我一直在尝试理解可重入锁和信号量(可重入锁与释放/解锁机制的嵌套)。

似乎拥有 Semaphore 需要您编写一个经过更彻底测试的应用程序,因为 release() 方法不会检查释放许可的线程是否实际上持有它。当我测试我的测试代码时,我发现这可能会随后增加许可数量,超出初始限制。另一方面,如果线程在调用 unlock 方法时没有持有可重入锁,我们会得到 IllegalMonitorException。

所以说没有真正的理由拥有二进制信号量是正确的,因为二进制信号量可以做的所有事情也可以通过 ReentrantLock 来完成。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈,以查看之前是否获得了许可(如果有可能进行后续获取,它是否也被释放 - 如果释放不继续它可能会阻塞并且很快 )。此外,由于可重入锁也为每个对象提供一个锁,所以使用可重入锁而不是二进制信号量不是更好的主意吗?

我在这里查看了一篇关于二进制信号量和互斥体之间区别的帖子,但是在 Java 中是否有类似互斥体的东西?

谢谢, 陈。

P.S - 我已经在另一个论坛 (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant) 上发布了这个问题,但我还没有收到回复。我想我也会在这里发布它,看看我能得到什么。

最佳答案

there is no real reason ever to have a binary semaphore as everything that a binary semaphore can do can also be done by a ReentrantLock

如果您只需要可重入互斥,那么是的,没有理由在可重入锁上使用二进制信号量。如果出于任何原因您需要非所有权释放语义,那么显然信号量是您唯一的选择。

Also since reentrant locks also provide one lock per object, isn't it always a better idea to prefer a reentrant lock to a binary semaphore?

这取决于需要。如前所述,如果您需要一个简单的互斥体,则不要选择信号量。如果多个线程(但数量有限)可以进入临界区,您可以通过线程限制或信号量来实现。

I have checked a post here that talks about difference between a binary semaphore and a mutex but is there a thing like a mutex in Java?

ReentrantLocksynchronized 是 Java 中互斥锁的示例。

关于java - 二进制信号量与可重入锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17683575/

相关文章:

java - 更改控件的颜色 FX PopOver 标题

c++ - 使用互斥操作和原语实现信号量

python - 定义适当的进程数

c - 相同的多线程代码在不同处理器上的时间差异?

带有 DISPATCH_TIME_FOREVER 的 swift 4.0 dispatch_semaphore_wait

java - Spring Framework - 为游戏创建规则引擎的设计模式

java - 从 xml 获取 img 标签

java - 如何设置JTable中的JCheckbox可编辑?

Python 线程模块无法识别 args

Android线程 - 在执行所有其他线程之前执行一个线程