我有一个缓存,它预先加载了大量数据(通过后台线程)并且在满之前无法使用(它也会经常重新加载并且在加载期间无法使用)。我希望使用它的类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() 会失败?我是否应该为标志而烦恼并抓住异常(因为如果抛出异常,就好像标志为假一样,我基本上会执行相同的代码)。我只是觉得我做错了什么,但我不能把手指放在上面。谢谢。