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(message==null) 条件.await();