我使用 WeakHashMap 和 ReentrantReadWriteLock 实现了一个缓存,我的代码是这样的:
class Demo<T, K> {
private final ReentrantReadWriteLock LOCK = new ReentrantReadWriteLock();
private final Map<T, K> CACHE = new WeakHashMap<>();
public K get(T t) {
ReentrantReadWriteLock.ReadLock readLock = LOCK.readLock();
ReentrantReadWriteLock.WriteLock writeLock = LOCK.writeLock();
readLock.lock();
if(CACHE.containsKey(t)){
//-- question point --
K result = CACHE.get(t);
readLock.unlock();
return result;
}
readLock.unlock();
K result = // find from db;
writeLock.lock();
CACHE.put(t,result);
writeLock.unlock();
return result;
}
}
我的问题是,如果 gc 在读锁之后if(CACHE.containsKey(t))
但之前执行K result = CACHE.get(t);
并导致这if(CACHE.containsKey(t))
是真的,但K result = CACHE.get(t);
会变为空。