What is the proper way to wrap semaphore actions in a try-catch block? What happens if the acquire action is interrupted after it has acquired some number, but not all, of
The Semaphore.acquire(int)
method is an all or nothing operation, either you get all the permits requested or you block. You can use a double try around your code, or let the (possible) interrupted exception from acquiring bubble up your call stack.
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);
}
On a tangent, do keep in mind that semaphores must be kept balanced by strict programming convention, so you should always release as many permits as you acquired.