19

随着try-with-resource在 Java 7 中的引入,我惊讶地发现它Lock并没有被改造为AutoCloseable. 看起来很简单,所以我自己添加了如下:

class Lock implements AutoCloseable {
    private final java.util.concurrent.locks.Lock _lock;
    Lock(java.util.concurrent.locks.Lock lock) {
        _lock = lock;
        _lock.lock();
    }
    @Override 
    public void close() {
        _lock.unlock();
    }
}

这适用于一个AutoCloseableReentrantReadWiteLock类,用法如下:

try (AutoCloseableReentrantReadWiteLock.Lock l = _lock.writeLock()) {
    // do something
}        

由于这似乎是自动关闭RAII的直接和规范使用,我认为一定有充分的理由不应该这样做。有人知道吗?

4

1 回答 1

23

try-with-resources在 2009 年 2 月/3 月提出时,这是一场大辩论。

该提案的作者 Josh Bloch 说:“这个结构是为一件事而设计的:资源管理。它不是为锁定而设计的。

有一个单独的提议来单独覆盖锁,但它没有得到任何结果。

我认为锁没有被覆盖的主要原因是:

  • 无法在 Java 7 中向接口添加方法
  • 创建实现正确接口的额外包装对象的性能损失
  • 哲学上反对Lock成为与文件句柄不同的资源(例如,创建 aLock并不需要调用该lock方法)

您可以在存档页面上关注所有历史上的讨价还价,例如这个线程

于 2013-06-11T11:49:21.327 回答