Я несколько новичок в многопоточных средах и пытаюсь найти лучшее решение для следующей ситуации:
Я читаю данные из базы данных один раз в день утром и сохраняю ихв HashMap в объекте Singleton.У меня есть метод установки, который вызывается только тогда, когда происходит изменение БД в течение дня (что будет происходить 0-2 раза в день).
У меня также есть геттер, который возвращает элемент на карте, и этот метод вызывается сотни раз в день.
Меня беспокоит случай, когда геттер вызывается, пока яЯ очищаю и воссоздаю HashMap, таким образом, пытаясь найти элемент в пустом / неправильно сформированном списке.Если я синхронизирую эти методы, это предотвращает одновременный доступ к геттеру двух читателей, что может стать узким местом в производительности.Я не хочу слишком сильно снижать производительность, поскольку записи случаются так редко.Если я использую ReentrantReadWriteLock, будет ли это вызывать очередь для любого, кто вызывает геттер, до снятия блокировки записи?Позволяет ли несколько читателей одновременно получать доступ к геттеру?Будет ли принудительно применяться только один писатель за раз?
Кодирование - это всего лишь вопрос ...
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock read = readWriteLock.readLock();
private final Lock write = readWriteLock.writeLock();
public HashMap getter(String a) {
read.lock();
try {
return myStuff_.get(a);
} finally {
read.unlock();
}
}
public void setter()
{
write.lock();
try {
myStuff_ = // my logic
} finally {
write.unlock();
}
}