Java等待没有锁释放

标签 java

如何在不释放锁的情况下让线程等待? 如果这不可能,那么我如何在不满足特定条件时暂停线程,并在满足条件或通知它时立即取消暂停

最佳答案

等待/通知的概念

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

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很强大。

关于Java等待没有锁释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55354914/

相关文章:

java - 获取Android onClickListener的返回值

java - 即使类明显存在,反射也会返回 0

java - 组合模型或实体?

Java 枚举 : Refactoring switch statements 'constant expression required' compile error?

c# - 为什么将国际化 "words"存储在单独的 (xml) 文件中?

java - 将图标设置为 JLabel - 不显示图标

java - 通过编程语言访问 Skype

java - #xD;和#13;读写 XML 文件时

java - Sonarqube - 为什么 java 生成的代码行没有被填充?

java - 无法读取java中的uni-code字符