我一直在尝试理解可重入锁和信号量(Reentrant锁vs释放/解锁机制的嵌套)。Binary Semaphore vs ReentrantLock
似乎有一个信号需要你写一个更彻底的测试应用程序,因为release()方法不检查释放许可的线程是否实际上持有它。当我测试我的测试代码时,我发现这可能会随后增加超出初始限制的许可数量。另一方面,如果一个线程在调用unlock方法时没有保留一个可重入锁,我们就会得到一个IllegalMonitorException。
因此,如果说没有任何真正的理由会产生二进制信号量,那么二进制信号量所能做的所有事情都可以通过ReentrantLock来完成。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈以查看是否获得了许可证(如果有后续获取的可能性,它也会被释放 - 如果发布版本不能继续发布它,则可能会阻止它;等等)。另外,因为可重入锁也为每个对象提供一个锁,所以将一个可重入锁置于二进制信号量不是一个更好的办法吗?
我已经在这里检查了一篇文章,讨论二进制信号量和互斥量之间的区别,但是有没有像Java中的互斥量那样的东西?
谢谢, 陈。
P.S - 我在另一个论坛发布了这个问题(http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant),我还没有收到答复。我想我会在这里发布,看看我能得到什么。
http://stackoverflow.com/questions/12641933/difference-between-semaphore-and-condition-reentrantlock可能有帮助 – 2013-07-16 17:52:33
该行为是由设计和[记录良好](http://docs.oracle.com/ javase/7/docs/api/java/util/concurrent/Semaphore.html#release%28%29):“*没有要求释放许可的线程必须通过调用acquire()来获得许可。通过编程约定在应用程序中建立信号量的使用。*“。使用ReentrantLocks时,您必须确保您在finally块中正确释放您的锁。这不是强制执行,但也有很好的文件记录。 – assylias
另见:http://stackoverflow.com/questions/7554839/how-and-why-can-a-semaphore-give-out-more-permits-than-it-was-initialized-with – assylias