Объект против условия, wait () против await () - PullRequest
0 голосов
/ 27 июня 2018

В решении задачи программирования, касающейся блокировок, я заметил, что они используют объект для синхронизации, поэтому что-то вроде:

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

и в методе:

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

мой вопрос, мог бы я вместо этого использовать Условие, скажем:

Condition cond = lock.newCondition();

, а затем используйте в методе

cond.await()

вместо этого, без помещения его в синхронизированный блок?

редактировать: решение: enter image description here

Как мне реализовать это с условием?

1 Ответ

0 голосов
/ 27 июня 2018

Да. Но вы должны сначала захватить замок. Смотрите документ 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();
}
...