需要 semaphore.relase() if semaphore.acquire() get InterruptedException?

2022-09-04 19:22:56

从Java java.util.concurrent.Semaphore文档来看,我不太清楚如果semaphore.acquire()阻塞线程,后来被中断Exception打断会发生什么。信号量值是否已降低,因此是否需要释放信号量?

目前我正在使用这样的代码:

try {
  // use semaphore to limit number of parallel threads
  semaphore.acquire();
  doMyWork();
}
finally {
  semaphore.release();
}

或者,当在 acquire() 期间发生中断异常时,我是否应该不调用 release()?


答案 1

调用 release() 当在 acquire() 期间发生中断异常时?

如果 .acquire() 被中断,则不会获取信号量,因此可能不应该释放它。

您的代码应该是

// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
  doMyWork();
}
finally {
  semaphore.release();
}

答案 2

nos 接受的答案部分正确,除了 semaphore.acquire() 也抛出了 InterruptedException。因此,为了100%正确,代码将如下所示:

try {
    semaphore.acquire();
    try {
        doMyWork();
    } catch (InterruptedException e) { 
        // do something, if you wish
    } finally {
        semaphore.release();
    }
} catch (InterruptedException e) {
    // do something, if you wish
}

推荐