二进制信号量与重入锁
我一直在尝试理解重入锁和信号量(重入锁的嵌套与释放/解锁机制)。
似乎拥有一个信号量需要你编写一个更彻底的测试应用程序,因为 release() 方法不会检查释放许可证的线程是否实际持有它。当我测试我的测试代码时,我发现这可能会随后增加超出初始限制的许可证数量。另一方面,如果线程在调用 unlock 方法时未持有重入锁,则我们得到一个 IllegalMonitorException。
因此,说没有真正的理由拥有二进制信号量是正确的,因为二进制信号量可以做的所有事情也可以由ReentrantLock完成。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈,以查看之前是否获得了许可证(如果有可能进行后续获取,它也被释放了 - 如果发布没有继续进行,则可能会阻止它等等)。此外,由于重入锁也为每个对象提供一个锁,因此更喜欢重入锁而不是二进制信号量不是更好吗?
我在这里查看了一篇帖子,其中讨论了二进制信号量和互斥体之间的区别,但是Java中是否有类似互斥体的东西?
谢谢 陈
P.S - 我已经在另一个论坛(http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant)上发布了这个问题,但我还没有收到回复。我想我也会把它贴在这里,看看我能得到什么。