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()将始终失败。
我是否需要在waitForCallback()中使用while循环包装condition.await()?
而(消息== NULL) condition.await();
答案 0 :(得分:1)
为什么我需要在onCallbackReceived()中执行alock.lock()/ unlock()。没有调用lock()/ unlock(),我得到了一个IllegalState异常。
您正试图signal
您没有锁定的情况。保持锁定的唯一方法是从onCallbackReceived
调用doSomething
,而没有任何迹象表明正在发生。
我是否需要使用while循环在waitForCallback()中包装condition.await()?
是的,假设您有5个线程停止在条件上,5个线程在lock
上被阻止。只有一个线程可以唤醒。如果当一个等待的线程最终唤醒另一个线程时,该字段出现了什么?您需要再次检查以确保谓词仍然正确。