对象与条件,wait()与await()

时间:2018-06-27 13:23:59

标签: java multithreading concurrency parallel-processing reentrantlock

在有关锁的编程练习的解决方案中,我注意到它们正在使用对象进行同步,所以类似:

Lock lock = new ReentrantLock();
Object obj = new Object();

和方法:

synchronized(obj){
obj.wait();}

我的问题是,我可以使用条件代替吗?

Condition cond = lock.newCondition();

然后在方法中使用

cond.await()

相反,而不是将其放在合成块中?

编辑:解决方案: enter image description here

我将如何使用条件来实现这一点?

1 个答案:

答案 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();
}