确保当一个线程更新地图时,另一个线程会看到此更新的最简单方法是什么?

时间:2013-07-01 17:23:42

标签: java concurrency concurrenthashmap

我需要有许多线程来操作共享的java.util.HashMap。

他们每个人都会执行单个读写操作(即没有人会使用批量操作,如putAll()),我想确保不会丢失更新。

同步写作是否保证安全?如果我做这样的事情:

writeLock.lock();
double latestValue = map.get(key);
map.put(key, latestValue + diff);
writeLock.unlock();

是否足以避免丢失更新?同样的方法是否足以实现可重复读取?

而且,如果我使用ConcurrentHashMap,我可以安全地摆脱我的locks吗?

UPD:如果我从HashMap切换到ConcurrentHashMap,内存使用是否有任何线性开销?

2 个答案:

答案 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或类似方法填充地图。