似乎使用信号量需要编写更经过充分测试的应用程序,因为 release() 方法不会检查释放许可的线程是否实际持有它。当我测试我的测试代码时,我发现这可能会随后增加许可证数量超出初始限制。另一方面,如果一个线程在调用 unlock 方法时没有持有可重入锁,则会出现 IllegalMonitorException。
所以说,有没有真正的理由拥有二进制信号量,因为二进制信号量能做的所有事情都可以通过 ReentrantLock 来完成。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈,以查看是否已获取许可证之前( 如果有可能后续获取 - 如果释放不进行处理,可能会阻塞等等 )。此外,由于可重入锁还为每个对象提供一个锁,是否总是更好地选择可重入锁而不是二进制信号量呢?
我查看了这里的一篇帖子,它谈到了二进制信号量和互斥量之间的区别,但是在 Java 中是否有互斥量这样的东西呢?
谢谢, Chan.
附言 - 我在另一个论坛(http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant)发布了这个问题,但还没有收到回复。我想也在这里发布一下,看看能得到什么。