0

我需要有许多在共享 java.util.HashMap 上运行的线程。

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

同步写入能保证安全吗?如果我做这样的事情:

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

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

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

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

4

2 回答 2

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的最适合您的目的。你也不需要锁。

于 2013-07-02T09:53:56.893 回答
0

您演示的读/写锁显然取决于任务,因为这就是它的设计目的。

但是,由于您似乎主要更新现有值,因此您可以考虑使用 AtomicIntegers 或类似内容填充您的地图。

于 2013-07-01T18:50:55.020 回答