正确的方式来尝试,赶上信号灯(Proper way to try-catch a semaphore

2019-07-20 17:51发布

什么是包装在一个try-catch块旗语动作的正确方法? 如果它已经收购了一些号码后获取的动作被中断,但不是全部,许可证的要求,会发生什么? 你怎么知道有多少再次释放? 如果发布的“最后”块去,但后来没有你可能释放证,如果行动被打断你没有得到什么?

try {
    lock.acquire(permits);

    //Do some things that require synchronization

    //Make sure to release all of the permits again!
    lock.release(permits);
} catch (InterruptedException e) {
    log.error("Interrupted!");
}

Answer 1:

Semaphore.acquire(int)方法是一个全有或全无操作,要么你得到所有的许可证要求或您阻止。 您可以使用双试试在你的代码,或者让(可能)中断异常从获取泡了调用栈。

双try块:

try {
    lock.acquire(permits);

    try {
        // do some stuff here
    } finally {
        lock.release(permits);
    }
} catch(final InterruptedException ie) {
    // handle acquire failure here
}

泡泡“收购”例外:

lock.acquire(permits);

try {
    // do some stuff here
} finally {
    lock.release(permits);
}

在一个切线,请记住,信号量必须保持严格的编程约定平衡,使您获得你应该总是释放尽可能多的许可证。



文章来源: Proper way to try-catch a semaphore