Java try 和finally 多线程示例中的阻塞

标签 java multithreading try-finally

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

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 block ,这两段代码可以工作吗? tryLock() 函数会抛出我不知道的异常吗?

最佳答案

这是一个人为的例子。我认为这里使用 try-finally block 是为了强化在 finally block 中释放锁的实践。

但在某些罕见的情况下它可能很有用;可能会抛出错误。另一个线程可以通过使用 Thread.stop() 导致当前线程中引发任何异常,或者可能发生类似 OutOfMemoryError 的运行时错误。

但是,在其中一种错误情况下,impendingBow() 可能会退出同时持有两个锁,并且调用者 bow() 不会释放这些锁。因此,这段代码不是示例性的。它显示了对在 finally 中释放锁的实践的敷衍遵守,而没有真正考虑清楚事情。

关于Java try 和finally 多线程示例中的阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707714/

相关文章:

java - 无法正确创建二叉树?

java - Dockerized Mac/Java 应用程序无法与本地主机通信

.net - 关于使用 "using"和 "finally"清理资源

java - 尝试打印出 "best customer"谁花费的金额最多

java - 无法获取可写数据库。 SQLite 异常 : not an error (code 0)

multithreading - storm 中的哪个类会实例化每个 bolt 和喷口的线程数?

c++ - io_context或std::cout在多线程UDP服务器中的奇怪行为

Java:无效的线程访问

java - 从 try finally block 中的 try block 返回

java - 使用try-finally执行return后的语句