在java.util.concurrent.locks.Lock一个AutoCloseable包装的

2019-09-03 12:03发布

随着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我想一定有一个很好的原因,这不应该做的。 有人知道吗?

Answer 1:

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

乔希布洛赫,该提案的作者说,“ 该构建物设计为一两件事,只有一两件事:资源管理这不是设计用来锁定。 ”

有一个单独的提案,分别覆盖锁,但没有取得任何进展。

我觉得没有涵盖的主要原因锁是:

  • 不可能的方法在Java 7中添加到界面
  • 创建一个额外的包装对象的性能损失是实施正确的接口
  • 哲学反对Lock是一个不同类型的资源从文件句柄(如创建Lock并不意味着调用lock法)

您可以按照所有的历史讨价还价的档案页面 ,例如这个线程 。



文章来源: Any risk in a AutoCloseable wrapper for java.util.concurrent.locks.Lock?