Binary Semaphore vs a ReentrantLock 二进制信号量与可重入锁

11 浏览
0 Comments

Binary Semaphore vs a ReentrantLock 二进制信号量与可重入锁

我一直在努力理解可重入锁和信号量(可重入锁的嵌套与释放/解锁机制)。似乎使用信号量需要编写更经过彻底测试的应用,因为release()方法并不检查释放许可的线程是否实际上持有该许可。当我测试我的测试代码时,发现这可能会导致许可数量超出初始限制。另一方面,如果一个线程在调用unlock方法时没有持有可重入锁,会抛出IllegalMonitorException异常。

所以可以说,是否可以说没有真正的理由使用二进制信号量,因为可重入锁可以完成二进制信号量所能做的一切。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈,以查看是否已获取许可(同时是否已释放,如果有可能会导致后续的获取阻塞,如果没有进行释放等等)。另外,由于可重入锁还为每个对象提供了一个锁,所以总是更倾向于使用可重入锁而不是二进制信号量。

我查看了一个关于二进制信号量和互斥锁之间的区别的帖子,但是Java中有互斥锁吗?

谢谢,

Chan。

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

0