我应该使用终结器来解锁或释放任何线程锁或其他资源吗?

时间:2013-10-24 10:20:03

标签: java multithreading

以下内容写于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();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

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

如果覆盖finalize()方法,则无法相信它会在垃圾收集器销毁对象之前始终被调用。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请勿使用以下代码

lock.isHeldByCurrentThread()

就这样做:

finally {     
            lock.unlock();        
    }