0

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

这个想法是实现一个可与“资源尝试”一起使用的 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() 子句?

4

1 回答 1

1

锁是用来共享的。锁定构造的锁只能使用锁定new,因此不可共享,这意味着它无用。

我相信您的示例代码仅用于说明目的(但如果不是,这绝对是一个坏主意),以帮助您提供更多真实案例。

根据您分享的内容猜测,与您表达的内容最接近的是synchronized关键字。

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

于 2019-12-02T07:53:02.630 回答