У меня есть кэш, который загружается заранее с большим количеством данных (фоновым потоком) и не может использоваться до полного заполнения (он также будет перезагружаться время от времени и будет непригодным для использования во время этой загрузки).Я хочу, чтобы классы, использующие его, проверяли флаг 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
?Возможно ли когда-нибудь, чтобы флаг был установлен в ложь, и попытка readLock () не удалась?Должен ли я вообще беспокоиться о флаге и просто поймать исключение (поскольку я в основном делаю тот же код, если исключение выдается, как если бы флаг был ложным).Я просто чувствую, что делаю что-то не так, но не могу понять, как это сделать.Спасибо.