Я новичок в многопоточных средах и пытаюсь найти лучшее решение для следующей ситуации:
Я читаю данные из базы данных один раз в день утром и сохраняю данные в 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();
}
}