在 try-catch block 中包装信号量操作的正确方法是什么?如果 acquire 操作在获得一些(但不是全部)所请求的许可后被中断,会发生什么情况?你怎么知道要再次释放多少?是否应该在“finally” block 中发布,但如果操作被中断,您是否可能发布您未获得的许可?
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)
方法是一个全有或全无的操作,要么获得所有请求的许可,要么阻止。您可以对您的代码使用双重尝试,或者让(可能的)中断异常从获取冒泡到您的调用堆栈。
双重尝试 block :
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);
}
切线,请记住,信号量必须通过严格的编程约定保持平衡,因此您应该始终释放与获得的许可一样多的许可。
关于java - try catch 信号量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139231/