0

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

4

4 回答 4

3

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

公共无效获取不间断()

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

如果没有可用的许可,则当前线程出于线程调度的目的而被禁用并处于休眠状态,直到某个其他线程为此信号量调用 release() 方法并且当前线程接下来被分配许可。

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

于 2012-10-22T19:05:55.320 回答
1

InterruptedException不是问题,只需将其包装在一个循环中:

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

然而,这段代码不是很安全和优雅,但只要你“想确保你能获得许可! ”就可以工作!

于 2012-10-22T18:50:41.067 回答
0

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

于 2012-10-22T18:48:47.167 回答
0

线程A

volatile boolean waitCondition = true

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

线程B

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

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

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

于 2012-10-22T19:15:30.190 回答