如果semaphore.acquire()得到InterruptedException,需要semaphore.relase()吗?

时间:2012-08-24 07:31:32

标签: java semaphore interrupted-exception

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

目前我使用的代码如下:

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

或者我应该在acquire()?

期间发生InterruptedException时不要调用release()

3 个答案:

答案 0 :(得分:11)

  

在acquire()?

期间发生InterruptedException时调用release()

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

您的代码应为

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

答案 1 :(得分:4)

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
}

答案 2 :(得分:0)

如果线程在获取方法调用之前被中断,或者在等待获取许可时,将抛出InterruptedException并且不会保留许可,因此不需要释放。只有当您确定获得许可证时(在调用获取方法调用之后),您才需要释放许可证。所以你最好在尝试块开始之前获得,比如:

sem.acquire();
try{
   doMyWork();
}finally{
   sem.release();
}