Я несколько новичок в многопоточных средах, и я пытаюсь найти лучшее решение для следующей ситуации:
Я читаю данные из базы данных один раз в день утром и сохраняю данные в HashMap в объекте Singleton. У меня есть метод setter, который вызывается только тогда, когда происходит внутридневное изменение БД (которое будет происходить 0-2 раза в день).
У меня также есть getter, который возвращает элемент на карте, и этот метод называется сотнями раз в день.
Я беспокоюсь о случае, когда геттер вызывается, пока я опустошаю и воссоздаю 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();
}
}