Java等待无锁释放

时间:2019-03-26 10:30:05

标签: java

如何在不释放锁的情况下使线程等待? 如果这不可能,那么在某个条件不满足时我如何暂停线程,并在条件满足时或在通知它时将其取消暂停

1 个答案:

答案 0 :(得分:0)

等待/通知的概念

等待/通知只能在锁的范围内完成(例如,同步方法或同步块)。

waitnotify都应在同一对象上同步。

等待线程:

synchronized(lockObject) {
  lockObject.wait(); <-- it will wait here until the notify is called.
}

通知线程:

synchronized(lockObject) {
  lockObject.notify();
}

lockObject可以是任何东西。它可能只是一个new Object(),但通常可能是某个集合,一个代表打印机的逻辑对象等等。

提示:从注释部分开始,您可能需要以下内容:notify仅释放一个等待线程。但是实际上您可能有多个线程在等待。如果要释放所有这些,请使用notifyAll

相同,但具有同步方法

或者,您可以创建一个类,并使用方法级别锁定。

class LockObject {
  public synchronized void waitMethod() {
    wait();
  }

  public synchronized void notifyMethod() {
    notify();
  }
}

同样,都必须使用相同的对象进行锁定。

LockObject instance = new LockObject();

然后等待线程:

instance.waitMethod();

通知线程:

instance.notifyMethod();

如果您对此很认真

还可以查看concurrency packages and tutorials of the JDK的内部,您将找到更多高级的锁定对象。仅举一个例子,countdown latches很强大。