대용량의 데이터 (백그라운드 스레드에 의해)로 미리로드되고 전체로드 될 때까지 사용할 수없는 캐시가 있습니다 (너무 자주 다시로드되고로드하는 동안 사용할 수 없게됩니다) . 액세스하기 전에 플래그를 확인하는 데 사용하는 클래스가 필요합니다. isLoaded()
나는이 같은 액세스 제어를위한 ReentrantReadWriteLock (나는 단순함의 코드에서 이것을 생략) 사용 ReentrantReadWriteLock 및 부울 플래그 사용
if (cache.isLoaded()) {
try {
Object x = cache.get(y);
} catch (IllegalStateException iex) {
// goto database for object
}
} else {
// goto database for object
}
가 정말 필요합니까 :
public class Cache {
private volatile boolean loaded = false; //starts false
private static String[] cache;
private static Lock readLock;
private static Lock writeLock;
public Object get(Object key) {
if (!readLock.tryLock()) throw IllegalStateException(...);
try {
... do some work
} finally {
readLock.unlock();
}
}
// called by background thread
private void loadFull() {
loaded = false;
writeLock.lock()
try {
cache = new String[];
... fill cache
} finally {
writeLock.unlock();
loaded = true;
}
}
....
}
지금 내 다른 클래스에서이 같은 블록을 가지고
try/catch
? 플래그가 false로 설정되고 readLock try()가 실패 할 가능성이 있습니까? 나는 플래그와 성가신 사실을 신경 써야 할까? (플래그가 false 인 것처럼 예외가 던져지면 기본적으로 동일한 코드를 수행하기 때문에) 예외를 잡아야한다. 나는 약간의 잘못하고있는 것처럼 느껴진다. 그러나 나는 그것에 손가락을 넣을 수 없다. 감사.
[캐시] (http : //en.wikipedia.org/wiki/Cache) 그리고 나는 우리가 당신이 [생산자/소비자 문제] (http://en.wikipedia.org/wiki/Producer-consumer_problem)를 해결하려고 노력하지 않았다. BTW,'IllegalStateException'은 사용할 적절한 것이 아닙니다. AFAI는 비어있는 캐시가 응용 프로그램에서 일반적인 것임을 이해합니다. – khachik
기존의 경량 캐싱 솔루션을 사용할 수없는 특별한 이유가 있습니까? –
별도의 읽기 및 쓰기 잠금이 필요합니까? 그리고 String [] 캐시는 새로운 int []로 생성됩니다. – extraneon