我在下面的代碼死鎖情況:升級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