【发布时间】:2013-07-15 01:10:40
【问题描述】:
我一直在尝试理解可重入锁和信号量(可重入锁与释放/解锁机制的嵌套)。
似乎拥有 Semaphore 需要您编写一个经过更彻底测试的应用程序,因为 release() 方法不会检查释放许可的线程是否实际上持有它。当我测试我的测试代码时,我发现这可能会随后增加许可数量,超出初始限制。另一方面,如果线程在调用 unlock 方法时没有持有可重入锁,我们会得到 IllegalMonitorException。
所以说没有真正的理由拥有二进制信号量是正确的,因为二进制信号量可以做的所有事情也可以通过 ReentrantLock 来完成。如果我们使用二进制信号量,我们将不得不检查整个方法调用堆栈,以查看之前是否获得了许可(如果有可能进行后续获取,它是否也被释放 - 如果释放不继续它可能会阻塞,并且很快 )。此外,由于可重入锁也为每个对象提供一个锁,所以使用可重入锁而不是二进制信号量不是更好的主意吗?
我在这里查看了一篇关于二进制信号量和互斥量之间区别的帖子,但是在 Java 中是否有类似互斥量的东西?
谢谢, 陈。
P.S - 我已经在另一个论坛 (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant) 上发布了这个问题,但我还没有收到回复。我想我也会把它贴在这里看看我能得到什么。
【问题讨论】:
-
这种行为是设计使然,well documented: "没有要求释放许可的线程必须通过调用acquire()获得该许可。信号量的正确用法是由应用程序中的编程约定建立。"。使用 ReentrantLocks 时,必须确保在 finally 块中正确释放锁。这也没有强制执行,但也有据可查。
标签: java multithreading semaphore