我需要有多个在共享 java.util.HashMap 上运行的线程。
它们中的每一个都将执行单个读取和写入操作(即没有一个将使用批量操作,例如 putAll()
),并且我想确保不会丢失更新。
同步写入能保证安全吗?如果我做这样的事情:
writeLock.lock();
double latestValue = map.get(key);
map.put(key, latestValue + diff);
writeLock.unlock();
这足以避免丢失更新吗?同样的方法足以实现可重复读取吗?
而且,如果我使用 ConcurrentHashMap
,我可以安全地摆脱我的锁
吗?
UPD:如果我从 HashMap 切换到 ConcurrentHashMap,内存使用是否有任何线性开销?
最佳答案
在同步块(synchronized block)中或获取锁后进行更新并不能保证您会看到最新的值。要查看更新/新值,您还需要锁定阅读。
// while writing
lock.lock();
try {
map.put(key, value);
}finally {
lock.unlock();
}
// while reading
lock.lock();
try {
map.get(key);
}finally{
lock.unlock()
}
是的,ConcurrentHashMap
最适合您的目的。而且你也不需要锁。
关于java - 确保当一个线程更新 map 时,另一个线程将看到此更新的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410176/