大量のデータが(バックグラウンドスレッドによって)事前に読み込まれ、いっぱいになるまで使用できないキャッシュがあります(また、頻繁に再読み込みされ、その読み込み中は使用できなくなります)。isLoaded()
これを使用するクラスがアクセス前にフラグをチェックするようにしたい。私は次のようなアクセス制御のためにReentrantReadWriteLockを使用します(簡単にするためにコードではこれを省略しています)。
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;
}
}
....
}
今、私の他のクラスには、次のようなブロックがあります。
if (cache.isLoaded()) {
try {
Object x = cache.get(y);
} catch (IllegalStateException iex) {
// goto database for object
}
} else {
// goto database for object
}
本当に必要try/catch
ですか?フラグがfalseに設定され、readLock try()が失敗する可能性はありますか?フラグを気にせず、例外をキャッチする必要があります(例外がスローされた場合、フラグがfalseであるかのように基本的に同じコードを実行するため)。ちょっとおかしなことをしているような気がしますが、指が上がれません。ありがとう。