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来实现一个类,以等待来自远程服务器的某些回调。我测试了此代码,似乎可以正常工作,但是我有几个问题。
while(消息==空)
condition.await();
最佳答案
您正在尝试signal
一个您不拥有该锁的条件。持有锁的唯一方法是,如果从onCallbackReceived
中调用doSomething
,则没有任何迹象表明正在发生。
是的,假设您在该条件下停止了5个线程,并在lock
上阻止了5个线程。只有一个线程可以唤醒。如果当等待的线程最终唤醒另一个线程却没有将该字段清空怎么办?您将需要再次检查以确保谓词仍然正确。