我在下面的代码死锁情况:升级Java的读锁写锁缓存在地图
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
,我可以预言这一点:
重入也允许将 从写入锁定降级到读取锁定,通过 获取写入锁定,然后读取锁定然后释放写入锁定 。 但是,从读锁 升级到写锁不是 可能。
而且只用一个锁,而不是读/写锁(这不会允许并发读取),是否有任何其他的方式来解决这样的问题?
是的,那正是我需要的。我将使用它并查看源代码以了解其工作原理。 – 2011-02-03 19:34:52