Пример использования Bow / Bower в руководстве java oracle с замком - PullRequest
0 голосов
/ 10 октября 2018

В примере с java-документами метод lock.unlock() используется дважды, один раз в методе impendingBow () и методе bow ().У меня вопрос: не должен ли метод lock.unlock() в методе impendingBow() добиться цели, зачем использовать его снова в методе bow()?Код ниже является фрагментом из документации Java:

public class Safelock {
static class Friend {
    private final String name;
    private final Lock lock = new ReentrantLock();

    public Friend(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public boolean impendingBow(Friend bower) {
        Boolean myLock = false;
        Boolean yourLock = false;
        try {
            myLock = lock.tryLock();
            yourLock = bower.lock.tryLock();
        } finally {
            if (! (myLock && yourLock)) {
                if (myLock) {
                    lock.unlock();
                }
                if (yourLock) {
                    bower.lock.unlock();
                }
            }
        }
        return myLock && yourLock;
    }

    public void bow(Friend bower) {
        if (impendingBow(bower)) {
            try {
                System.out.format("%s: %s has"
                    + " bowed to me!%n", 
                    this.name, bower.getName());
                bower.bowBack(this);
            } finally {
                lock.unlock();
                bower.lock.unlock();
            }
        } else {
            System.out.format("%s: %s started"
                + " to bow to me, but saw that"
                + " I was already bowing to"
                + " him.%n",
                this.name, bower.getName());
        }
    }

}

1 Ответ

0 голосов
/ 21 октября 2018

не должен lock.unlock() метод в impendingBow() методе делать свое дело, зачем использовать его снова в bow() методе?

В impendingBow, когда обе попытки блокировкиесли все прошло успешно, то lock.unlock() не будет достигнуто.Метод возвращает true, оставляя обе блокировки в заблокированном состоянии.Смотрите условное заявление до разблокировки звонков.В этом случае (обе блокировки были успешными), bow() должен разблокировать блокировки.

...