我想问一下这种实现是否可行,或者有些问题以后可能会出现问题。
这个想法是实现一个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();
}
}
}
此实现可以吗? (调用构造函数中的锁...)
如果关闭没有引发异常,为什么编译器会强迫我添加catch()子句?
答案 0 :(得分:1)
锁旨在共享。
只能使用new
来锁定用于构造的锁,因此无法共享,这意味着它无用。
我相信您的示例代码仅用于说明目的(但如果不是,这绝对不是一个好主意),以帮助您更多地了解实际情况。
从您分享的内容中猜测,最接近您所表达的内容就是synchronized
关键字。
通常,锁交互很难处理,这导致了同步机制的创建。相反,应该在无法同步的非常特殊的情况下使用锁。