我需要有许多线程来操作共享的java.util.HashMap。
他们每个人都会执行单个读写操作(即没有人会使用批量操作,如putAll()
),我想确保不会丢失更新。
同步写作是否保证安全?如果我做这样的事情:
writeLock.lock();
double latestValue = map.get(key);
map.put(key, latestValue + diff);
writeLock.unlock();
是否足以避免丢失更新?同样的方法是否足以实现可重复读取?
而且,如果我使用ConcurrentHashMap
,我可以安全地摆脱我的locks
吗?
UPD:如果我从HashMap切换到ConcurrentHashMap,内存使用是否有任何线性开销?
答案 0 :(得分:2)
在同步块中或获取锁定后执行更新并不能保证您将看到最新值。要查看更新/新鲜值,您还需要锁定以便阅读。
// while writing
lock.lock();
try {
map.put(key, value);
}finally {
lock.unlock();
}
// while reading
lock.lock();
try {
map.get(key);
}finally{
lock.unlock()
}
是的ConcurrentHashMap
最适合您的目的。你也不需要锁。
答案 1 :(得分:0)
您演示的读/写锁定显然可以完成任务,因为这就是它的设计目标。
但是,由于您似乎主要更新现有值,因此可以考虑使用AtomicIntegers或类似方法填充地图。