在有关锁的编程练习的解决方案中,我注意到它们正在使用对象进行同步,所以类似:
Lock lock = new ReentrantLock();
Object obj = new Object();
和方法:
synchronized(obj){
obj.wait();}
我的问题是,我可以使用条件代替吗?
Condition cond = lock.newCondition();
然后在方法中使用
cond.await()
相反,而不是将其放在合成块中?
我将如何使用条件来实现这一点?
答案 0 :(得分:2)
是的。但是您必须先获取锁。请参阅Condition.await()的文档:
假定当前线程持有与此相关的锁 调用此方法时的条件。取决于实施 确定是否是这种情况,如果不是,如何做出反应。 通常,会引发异常(例如 IllegalMonitorStateException)和实现必须记录 这个事实。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
与
相似ReentrantLock lock = new ReentrantLock();
Condition cond = lock.newCondition();
lock.lock();
try {
while (<condition does not hold>)
cond.await();
}
} finally {
lock.unlock();
}