我有三个线程,它们需要运行一些使用信号量实现的资源(A,B,C)。

public void run(){
 while(!Thread.currentThread().isInterrupted){
  try{
    A.acquire(2);
    B.acquire(2);
    //some-stuff
  }
  catch(InterruptedException ex){}
  finally{
     A.release(2); //PROBLEM
     B.release(2);
         }
  }

问题:运行时,线程可能会中断,但是进入finally方法时,我不知道中断期间我在哪里,所以我不知道是否必须释放某些内容。
我尝试了很多不同的实现,例如使用(boolean) tryAcquire()方法,但是又出现了另一个问题:如果我获得资源A而不是资源B,那么在finally块中,我将再次释放A等。
你有什么建议吗?谢谢你。

最佳答案

您可以尝试像这样使用List:

List<Semaphore> acquired = new ArrayList<>(2);
while(!Thread.currentThread().isInterrupted) {
  try{
    A.acquire(2);
    acquired.add(A);
    B.acquire(2);
    acquired.add(B);
    //some-stuff
  } catch(InterruptedException ex){}
  finally{
    for (Semaphore s : acquired) {
      s.release(2);
    }
    s.clear();
  }
}

09-28 07:25