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
没有真正考虑清楚就释放锁的做法是敷衍了事。
我是新来的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
没有真正考虑清楚就释放锁的做法是敷衍了事。