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