Java等待而不释放锁

Boy*_*yar 5 java

如何让线程等待而不释放锁?如果这是不可能的,那么如何在不满足某个条件时暂停线程,并在满足条件或通知它时立即取消暂停它

bvd*_*vdb 0

等待/通知的概念

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

wait和都notify应该在同一个对象上同步。

等待线程:

synchronized(lockObject) {
  lockObject.wait(); <-- it will wait here until the notify is called.
}
Run Code Online (Sandbox Code Playgroud)

通知线程:

synchronized(lockObject) {
  lockObject.notify();
}
Run Code Online (Sandbox Code Playgroud)

lockObject 可以是任何东西。它可能只是一个new Object(),但很多时候它可能是某个集合、代表打印机的逻辑对象……任何东西。

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

同样的事情,但是使用同步方法

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

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

  public synchronized void notifyMethod() {
    notify();
  }
}
Run Code Online (Sandbox Code Playgroud)

同样,两者都必须使用同一个对象来锁定。

LockObject instance = new LockObject();
Run Code Online (Sandbox Code Playgroud)

然后等待线程:

instance.waitMethod();
Run Code Online (Sandbox Code Playgroud)

和通知线程:

instance.notifyMethod();
Run Code Online (Sandbox Code Playgroud)

如果你认真对待这件事

另外看看concurrencyJDK的包和教程,你会发现更高级的锁定对象。仅举一例,倒计时锁存器功能强大。