我对多线程环境有些陌生,正在尝试为以下情况找到最佳解决方案:
我每天早上从数据库中读取数据,并将数据存储在 Singleton 对象的 HashMap 中。当 intra-day 数据库更改发生时(每天可能会发生0-2次),只有调用 setter 方法。
还有一个 getter 方法,用于返回 map 中的元素,这个方法每天会被调用数百次。
我担心 getter 在我清空和重新创建 HashMap 时被调用,从而尝试在一个空/畸形列表中查找元素。如果我使这些方法同步化,它将阻止两个 reader 同时访问 getter,这可能会成为性能瓶颈。因为写入非常不频繁,所以我不想付出太大的性能损失。如果我使用 ReentrantReadWriteLock,它会强制要求任何调用 getter 的人排队等待写锁释放吗?它是否允许多个 reader 同时访问 getter?它是否强制只有一个 writer 可以同时写入?
编写这个代码只是...
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();
}
}
volatile
确实是必需的。 - ninjalj