什么是包装在一个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!");
}
该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);
}
在一个切线,请记住,信号量必须保持严格的编程约定平衡,使您获得你应该总是释放尽可能多的许可证。