我想问一下这个实现是否可以,或者也许有一些问题以后可能会出现问题。
这个想法是实现一个可以与"尝试资源"一起使用的ReentrantLock类,这意味着它必须实现AutoCloseable接口。
此外,我想问为什么在"main"方法中编译器产生我必须添加一个"catch"子句,因为我的关闭方法(在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(( 子句?
锁是用来共享的。 锁定建筑的锁只能使用new
锁定,因此不可共享,这意味着它毫无用处。
我相信您的示例代码仅用于说明目的(但如果没有,这绝对是一个坏主意(,为了帮助您更多,应该给出一个真实的案例。
从您分享的内容中猜测,与您表达的内容最接近的是synchronized
关键字。
通常,锁交互很难处理,这导致了同步机制的创建。改用锁应在无法同步的非常特殊的情况下进行。