重入锁定条件

时间:2015-11-17 19:03:31

标签: java multithreading conditional-statements reentrantlock

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来实现一个类来等待来自远程服务器的某些回调。我测试了这段代码,看起来很有用,但我有几个问题。

  1. 为什么我需要在onCallbackReceived()中执行alock.lock()/ unlock()。没有调用lock()/ unlock(),我得到了一个IllegalState异常。我很困惑,因为当另一个线程调用onCallbackReceived()时,waitForCallback()的调用者持有锁,因此onCallbackReceived()中的alock.lock()将始终失败。

  2. 我是否需要在waitForCallback()中使用while循环包装condition.await()?

    而(消息== NULL)     condition.await();

1 个答案:

答案 0 :(得分:1)

  

为什么我需要在onCallbackReceived()中执行alock.lock()/ unlock()。没有调用lock()/ unlock(),我得到了一个IllegalState异常。

您正试图signal您没有锁定的情况。保持锁定的唯一方法是从onCallbackReceived调用doSomething,而没有任何迹象表明正在发生。

  

我是否需要使用while循环在waitForCallback()中包装condition.await()?

是的,假设您有5个线程停止在条件上,5个线程在lock上被阻止。只有一个线程可以唤醒。如果当一个等待的线程最终唤醒另一个线程时,该字段出现了什么?您需要再次检查以确保谓词仍然正确。