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 に答える