用于Java中的线程间互换的Mutex?

时间:2012-10-22 18:43:06

标签: java multithreading synchronization mutex semaphore

我想要一个Java中的Mutex,让我在一个线程中等待它并在另一个线程中释放它。我知道我可以使用容量为1的信号量,但问题是“acquire()”方法抛出“InterruptedException”。在Java中是否有任何特殊的同步方法用于此目的?

4 个答案:

答案 0 :(得分:3)

幸运的是,Semaphore为您提供了这种方法:)

public void acquireUninterruptibly()

  

从此信号量获取许可,阻止直到一个   可用。获得许可证(如果有)并返回   立即将可用许可证的数量减少一个。

     

如果没有可用许可证,则当前线程将被禁用   线程调度的目的和休眠直到其他一些线程   为此信号量和当前线程调用release()方法   接下来将被分配许可证。

     

如果当前线程在等待许可时被中断,那么   它将继续等待,但是分配线程的时间   许可证可能会与收到许可证的时间相比发生变化   许可证没有发生中断。当线程确实返回时   此方法将设置其中断状态。

答案 1 :(得分:1)

InterruptedException不是问题,只需将其包装成循环:

while(true) {
    try {
        semaphore.acquire();
        break;
    } catch(InterruptedException e) {
        //swallow, continue;
    }
}

然而,这段代码并不是非常安全和优雅,但只要您 想要确保获得许可证就可以使用!"

答案 2 :(得分:0)

如果您有一个线程要等待的代码,那么除非您使用synchronized块,否则您肯定必须处理中断的异常。另外,中断异常有什么问题?

答案 3 :(得分:0)

<强>的ThreadA

volatile boolean waitCondition = true

synchronized(lockObject) {
  while (waitContidion) {
    lockObject.wait();
  }
}

<强> ThreadB

synchronized(lockObject) {
  waitCondition = false;
  lockObject.notifyAll();
}

或在锁定实例上使用条件/信号。

正确处理InterruptedException是非常重要的,至少你必须使用catch块中的 Thread.currentThread()。interrupt()方法设置它的中断标志。