Я реализовал кеш с использованием 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);
становится нулевым.