public class MyLockConditionTest {
    private final Lock alock = new ReentrantLock();
    private final Condition condition = alock.newCondition();
    private String message = null;

    public void waitForCallback() {
         alock.lock();
         try {
            // wait for callback from a remote server
            condition.await();
            doSomething(message);
         } finally {
              alock.unlock();
         }
    }

    // another thread will call this method as a callback to wake up the thread called condition.await()
    public void onCallbackReceived(String message) {
         alock.lock();
         try {
            this.message = message
            condition.signal();
         } finally {
              alock.unlock();
         }
    }
}

我有这段代码使用ReentrantLock和Condition来实现一个类,以等待来自远程服务器的某些回调。我测试了此代码,似乎可以正常工作,但是我有几个问题。
  • 为什么我需要在onCallbackReceived()中执行alock.lock()/unlock()。没有调用lock()/unlock(),我得到了一个IllegalState异常。我很困惑,因为当另一个线程调用onCallbackReceived()时,锁由waitForCallback()的调用者持有,因此onCallbackReceived()中的alock.lock()将始终失败。
  • 是否需要使用while循环将condition.await()包裹在waitForCallback()中?

    while(消息==空)
    condition.await();
  • 最佳答案



    您正在尝试signal一个您不拥有该锁的条件。持有锁的唯一方法是,如果从onCallbackReceived中调用doSomething,则没有任何迹象表明正在发生。



    是的,假设您在该条件下停止了5个线程,并在lock上阻止了5个线程。只有一个线程可以唤醒。如果当等待的线程最终唤醒另一个线程却没有将该字段清空怎么办?您将需要再次检查以确保谓词仍然正确。

    09-27 15:21