我可以修改 ReentrantLock 以便可以将其与 try 一起使用资源吗?



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

这个想法是实现一个可以与"尝试资源"一起使用的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();
}           
}
}
  1. 这个实现可以吗?(调用构造函数中的锁...

  2. 如果我的收盘价没有引发异常,为什么编译器会强制我添加一个 catch(( 子句?

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

我相信您的示例代码仅用于说明目的(但如果没有,这绝对是一个坏主意(,为了帮助您更多,应该给出一个真实的案例。

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

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

相关内容

最新更新