Java try and finally 在多线程示例中阻塞

Java try and finally blocks in a multithreading example

我是新来的Java。我在 Oracle Java 教程中阅读了有关 Java 并发性的内容,特别是有关锁定对象 Link to Page 的部分。我似乎无法理解的是为什么在 impendingBow() 和 bow() 方法中使用 try 和 finally 块;

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

这两段代码在没有 try-finally 块的情况下可以工作吗? tryLock() 函数会抛出我不知道的异常吗?

这是一个人为的例子。我认为这里使用 try-finally 块是为了加强在 finally 块中释放锁的做法。

但在极少数情况下它可能会有用;可能会抛出错误。另一个线程可以通过使用 Thread.stop() 导致在当前线程中引发任何异常,或者可能会发生像 OutOfMemoryError 这样的运行时错误。

然而,在其中一种错误情况下,impendingBow() 可能会持有两个锁退出,并且调用者 bow() 不会释放这些锁。因此,此代码不是示例性的。这表明在 finally 没有真正考虑清楚就释放锁的做法是敷衍了事。