我不确定以下实现是否正确。我的原因是,如果当前线程在等待收到信号时被中断,则 finally
block 将被调用,但因为它没有持有锁,所以 IllegalMonitorStateException
将被抛出。我是否实现了 try-finally
在这种情况下正确阻止还是应该实现?
public void acquire() throws InterruptedException {
try {
lock.lockInterruptibly();
while (permits == 0) {
condition.await();
}
permits--;
}
finally {
lock.unlock();
}
}
最佳答案
不确定我是否正确理解问题,但您应该在分配资源后才尝试最终
public void acquire() throws InterruptedException {
lock.lockInterruptibly(); // allocate resource before try
try {
while (permits == 0) {
condition.await();
}
permits--;
}
finally {
lock.unlock();
}
}
我不知道为什么所有学校都这样做,例如Sun's official page on finally ,建议在 try 内进行分配(这样您就需要在 finally 子句中使用 if(allocated) {release}
)。在我看来,这是愚蠢的。为什么大家都建议配置里面试试?
关于java - 信号量锁的正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087573/