1

以下是用 Effective Java 2nd 编写的:-

例如,依靠终结器来释放共享资源(如数据库)上的持久锁是使整个分布式系统陷入停顿的好方法。

因为,

完全有可能,甚至很可能,程序在没有对不再可访问的对象执行终结器的情况下终止。

那么写下面的代码就可以了吗?

 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();
        }
    }
}
4

3 回答 3

1

您将终结器(Object.finalize()方法的实现)误认为是finally块。

如果您覆盖该finalize()方法,您不能相信它总是会在垃圾收集器销毁对象之前被调用。

一个finally块更可靠;即使在相应的try块内引发异常,它也会始终执行,因此释放其中的资源是安全的。

于 2013-10-24T10:26:47.437 回答
0

您必须始终在 finally{} 块中解锁锁定。您不应该进行lock.isHeldByCurrentThread()检查,因为如果程序到达 finally 块,当前线程总是会获取锁。

于 2013-10-24T10:23:20.350 回答
0

不要使用下面的代码

lock.isHeldByCurrentThread()

去做就对了:

finally {     
            lock.unlock();        
    }
于 2013-10-24T10:28:16.720 回答