我对多线程环境有些陌生,我正在尝试为以下情况提出最佳解决方案:
我每天早上从数据库中读取一次数据,并将数据存储在 Singleton 对象的 HashMap 中。我有一个 setter 方法,仅在发生日内数据库更改时调用(每天发生 0-2 次)。
我还有一个 getter,它返回地图中的一个元素,这个方法每天被调用数百次。
我担心在清空和重新创建 HashMap 时调用 getter 的情况,从而试图在空/格式错误的列表中找到一个元素。如果我使这些方法同步,它会阻止两个读取器同时访问 getter,这可能是性能瓶颈。我不想对性能造成太大的影响,因为写入很少发生。如果我使用 ReentrantReadWriteLock,这是否会强制任何调用 getter 的人排队,直到释放写锁?它是否允许多个读者同时访问 getter?它会一次只强制一名作家吗?
编码这只是一个问题......
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();
}
}