我是 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/