Sar*_*rah 10 java multithreading synchronized reentrantreadwritelock
我对多线程环境有些新意,我正在尝试为以下情况提出最佳解决方案:
我每天早上从数据库中读取一次数据,并将数据存储在Singleton对象的HashMap中.我有一个setter方法,只有在发生日内DB更改时才会调用(每天会发生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();
}
}
Run Code Online (Sandbox Code Playgroud)
sjl*_*lee 14
实现此目的的另一种方法(不使用锁)是写时复制模式.当你不经常写作时,它很有效.我们的想法是复制和替换字段本身.它可能如下所示:
private volatile Map<String,HashMap> myStuff_ = new HashMap<String,HashMap>();
public HashMap getter(String a) {
return myStuff_.get(a);
}
public synchronized void setter() {
// create a copy from the original
Map<String,HashMap> copy = new HashMap<String,HashMap>(myStuff_);
// populate the copy
// replace copy with the original
myStuff_ = copy;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,读者完全并发,他们支付的唯一惩罚是myStuff_上的易失性读取(这很少).作者是同步的,以确保相互排斥.
| 归档时间: |
|
| 查看次数: |
5486 次 |
| 最近记录: |