我如何保证线程在终止时安全地解锁锁,而所有方法都已经处理了它?

How can I guarantee a thread is safely unlocking a lock upon termination, while all methods already handle it?

一个服务器项目,可能 运行 很长时间并创建许多线程。 在下面的代码中,我问自己,除了方法 setData(MyData data):

中的整体 try catch 之外,我是否还必须以某种方式保护锁

注意:假设它是线程安全的,我不太熟悉可能导致线程终止的其他原因或自然灾害,例如 windows 7 限制左右。 (我并不贪心,使用+-5个线程,但仍然)

public class MyFactory {

private ReadWriteLock rwl = new ReentrantReadWriteLock();
    private Lock readLock = rwl.readLock();
    private Lock writeLock = rwl.writeLock();
    
    private static MyFactory _instance = new MyFactory();
    private static Map<Integer, MyData> mapDatas = new HashMap<>();
    
    public static MyFactory getInstance() {
        return _instance;
    }
    
    
    public void setData(MyData data) {
        writeLock.lock();   
        try {
            mapData.put(...);
        } catch (Exception exc) {
            ...
        } finally {
            writeLock.unlock();
        }
    }

假设您从不将锁暴露给其他对象,并且您总是在 finally 块中使用解锁锁,那没问题。

原因是 finally 块中的代码 alwaystry[ 中发生某些事情时调用=23=] 或 catch 块。即使抛出 Error 也是如此。例如,当您内存不足或某些 DLL 存在链接错误时,就会发生这些情况。如果发生比 Error 的事情,那也可能会结束您的流程并使问题变得毫无意义。