【问题标题】:Java try and finally blocks in a multithreading example多线程示例中的 Java try and finally 块
【发布时间】:2015-07-29 17:54:06
【问题描述】:

我是 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() 函数会抛出我不知道的异常吗?

【问题讨论】:

  • 我想是的,暗示tryLock() 可能会引发异常。

标签: java multithreading try-finally


【解决方案1】:

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

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

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

【讨论】:

  • 比这更容易。当类型与占位符不匹配时,System.out.format 将抛出 IllegalArgumentExceptions。您不希望调试代码中的拼写错误导致您泄漏锁。
  • 我不知道释放锁的做法。这开始变得更有意义了。谢谢。
  • @DavidEhrmann 在这里,我要强调的是,即使try 块中的代码没有错误(事实上),程序员无法控制的运行时条件也会引发异常。格式语句中的类型问题是单元测试应该发现的错误。
猜你喜欢
  • 2015-09-05
  • 2011-02-11
  • 1970-01-01
  • 2011-06-01
  • 2017-07-20
  • 2011-10-31
  • 2015-01-22
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多