我可以修改ReentrantLock,以便可以尝试使用它吗?

时间:2019-12-02 07:07:50

标签: java reentrantlock autocloseable

我想问一下这种实现是否可行,或者有些问题以后可能会出现问题。

这个想法是实现一个ReentrantLock类,该类可以与“尝试资源”一起使用,这意味着它必须实现AutoCloseable接口。

此外,我想问为什么在“ main”方法中编译器会产生必须添加“ catch”子句的原因,因为我的close方法(在MyReentrantLock中)不会引发异常。

import java.util.concurrent.locks.ReentrantLock;

public class Ex09ReentrantLock {

    @SuppressWarnings("serial")
    public static class MyReentrantLock extends ReentrantLock implements AutoCloseable{

        public MyReentrantLock() {
            super();
            lock();
        }

        @Override
        public void close(){        
            unlock();
        }   
    }

    public static AutoCloseable lock() {

        var locker = new MyReentrantLock(); //lock() is called in the constructor

        return locker;  //implements AutoCloseable          
    }


    //Demo 
    public static void main(String[] args) {

        //try(ReentrantLock lock = new ReentrantLock()){} = compiler error

        try(var locker = lock();){          
            //some work...          
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           
    }
}
  1. 此实现可以吗? (调用构造函数中的锁...)

  2. 如果关闭没有引发异常,为什么编译器会强迫我添加catch()子句?

1 个答案:

答案 0 :(得分:1)

锁旨在共享。 只能使用new来锁定用于构造的锁,因此无法共享,这意味着它无用。

我相信您的示例代码仅用于说明目的(但如果不是,这绝对不是一个好主意),以帮助您更多地了解实际情况。

从您分享的内容中猜测,最接近您所表达的内容就是synchronized关键字。

通常,锁交互很难处理,这导致了同步机制的创建。相反,应该在无法同步的非常特殊的情况下使用锁。