ReentrantReadWriteLock - много читателей одновременно, по одному писателю?

Я новичок в многопоточных средах и пытаюсь найти лучшее решение для следующей ситуации:

Я читаю данные из базы данных один раз в день утром и сохраняю данные в 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();
    }
}
10
задан Joe 12 May 2011 в 18:26
поделиться