以下内容写于Effective Java 2nd addition中: -
例如,取决于终结器以释放共享资源上的持久锁定 比如数据库是将整个分布式系统引入的好方法 嘎然而止。
因为,
完全可能,甚至可能,程序终止而不执行 一些不再可达的对象的终结器。
那么可以编写以下代码吗?
public void doSomething(long abc) {
//Needs to wait on lock to avoid updates
ReentrantLock lock = mainLock;
lock.lock();
try {
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
答案 0 :(得分:1)
您误认为finally
块的终结器(Object.finalize()方法的实现)。
如果覆盖finalize()
方法,则无法相信它会在垃圾收集器销毁对象之前始终被调用。
finally
块更可靠;即使在相应的try
块内抛出异常也始终执行它,因此释放其中的资源是安全的。
答案 1 :(得分:0)
您必须始终在finally {}块中解锁锁定。您不应该进行lock.isHeldByCurrentThread()
检查,因为如果程序到达finally块,则当前线程始终会获取锁。
答案 2 :(得分:0)
请勿使用以下代码
lock.isHeldByCurrentThread()
就这样做:
finally {
lock.unlock();
}