【发布时间】:2011-02-03 12:29:54
【问题描述】:
我在下面的代码中出现了死锁情况:
private static final ReadWriteLock opClassesLock = new ReentrantReadWriteLock();
private static final Map<Class<?>, ServiceClass> opClasses = new WeakHashMap<Class<?>, ServiceClass>();
public static ServiceClass get(Class<?> myClass) {
opClassesLock.readLock().lock();
try {
ServiceClass op = opClasses.get(myClass);
if (op == null) {
opClassesLock.writeLock().lock(); // deadlock here
try {
op = new ServiceClass(myClass);
opClasses.put(myClass, op);
} finally {
opClassesLock.writeLock().unlock();
}
}
return op;
} finally {
opClassesLock.readLock().unlock();
}
}
如果我检查了ReentrantReadWriteLock 的文档,我可以预测到:
重入也允许降级 从写锁到读锁,通过 获取写锁,然后 读锁,然后释放写 锁。 但是,从读取升级 锁到写锁不是 可能。
除了只使用单个锁而不是读/写锁(不允许并发读取)之外,还有其他方法可以解决此类问题吗?
【问题讨论】:
标签: java concurrency synchronization locking deadlock