Зачем приобретать блокировку в операции освобождения - PullRequest
0 голосов
/ 17 апреля 2020

В контексте создания монитора для управления доступом к одному ресурсу, мой профессор дал нам этот код:

private final Lock monitor;       
private final Condition nonBusy; 
private boolean busy;             

// acquire resource
public void acquire() throws InterruptedException {
    monitor.lock();     
    try {   
        while(busy)
            nonBusy.await();            
        busy = true;    
    } finally {
        monitor.unlock();   
    }
}

// release the previously acquired resource 
public void release() {
    monitor.lock();
    try {
        busy = false;       
        nonBusy.signal();   
    } finally {
        monitor.unlock();
    }
}

Почему разблокировка в конце операции acquire и блокировка в начало выпуска operation? Если я только что получил доступ к ресурсу, зачем снимать блокировку для него?

1 Ответ

1 голос
/ 17 апреля 2020

В основном, вы используете Lock, логический флаг и переменную условия для реализации эквивалента Lock. Вы правы, считая, что это полностью излишне. Я думаю, что ваш профессор просто дает вам упражнение, чтобы показать правильный способ ожидания состояния и правильный способ сообщить о нем. Могло бы быть немного более креативным, если бы придумал причину ожидания и причину для сигнала, но что угодно. Важным является шаблон , воплощенный в этих функциях acquire() и release().

Обратите внимание, что это , а не пример того, как на самом деле реализуются блокировки уровень операционной системы, потому что отсутствует понятие wait set . То есть набор потоков, ожидающих получения какой-либо данной блокировки, набор потоков, ожидающих, чтобы быть пробужденным вызовом condition.signal(), набор потоков, ожидающих запуска ЦП, и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...