java - 确保当一个线程更新 map 时,另一个线程将看到此更新的最简单方法是什么?

标签 java concurrency concurrenthashmap

我需要有多个在共享 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/

相关文章:

java - 使用 FirefoxProfile 以编程方式打开 Firefox 开发工具

java - 如何使用颜色代码为 Swing 组件添加背景颜色?

Java如何在jar环境而不是IDE中读取文件夹并列出该文件夹中的文件

java - Google Apps 脚本是否可以通过 HTTP POST 接收文件?

c# - 安全清除列表(并发)

swift - 从 actor 的 init 方法中调用方法

go - 确保 goroutine 清理,最佳实践

java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器

java - 如何从 ConcurrentHashMap<String, Set<String>> 中删除用作值的 Set?

java - 为什么 ConcurrentHashMap 使用局部变量 `tab` 来引用表?