我如何保证线程在终止时安全地解锁锁,而所有方法都已经处理了它?
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 块中的代码 always 在 try[ 中发生某些事情时调用=23=] 或 catch 块。即使抛出 Error
也是如此。例如,当您内存不足或某些 DLL 存在链接错误时,就会发生这些情况。如果发生比 Error
更 的事情,那也可能会结束您的流程并使问题变得毫无意义。
一个服务器项目,可能 运行 很长时间并创建许多线程。
在下面的代码中,我问自己,除了方法 setData(MyData data)
:
注意:假设它是线程安全的,我不太熟悉可能导致线程终止的其他原因或自然灾害,例如 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 块中的代码 always 在 try[ 中发生某些事情时调用=23=] 或 catch 块。即使抛出 Error
也是如此。例如,当您内存不足或某些 DLL 存在链接错误时,就会发生这些情况。如果发生比 Error
更 的事情,那也可能会结束您的流程并使问题变得毫无意义。