Serj Rudで:
私はにそれを入れている間、私は現在の値を変更するときに何が起こるか疑問に思いますConcurrentHashMap
。
私が持っているConcurrentHashMap
(ConncurentHashMap<String, Integer> attendance
会議ホール名および各への訪問者数の既存のマッピングを使用)。
すべての呼び出しvisit(conferenceHallName)
方法は、与えられた会議場への訪問者の数をインクリメントすることになっています。すべての呼び出しはスレッドです。
だからここに方法は次のとおりです。
public void visit(String conferenceHallName) {
attendance.put(conferenceHallName, attendance.get(conferenceHallName) + 1);
}
put()
ロック方法は、あるget()
はありません。しかし、この場合には最初に起こります。
- スレッドは、このマッピングでセグメントをロックし、新しい値を計算してから入れてリリースされます私のために完璧ですか
- スレッドは、私のために矛盾を意味し、私は回避策を見つける必要がありますセグメントとプットをロックし、新しいものを計算し、古い値を取得します。
2番目のシナリオが現実に何が起こるかである場合と使用しますAtomicInteger
代わりにInteger
私の問題を解決しますか?
dasblinkenlight:
スレッドが新しいの構築、スレッドセーフな方法で値にアクセスします:第二の記述は、実際に何が起こるかに近いInteger
、マップをロックし、更新されたカウントで、オブジェクトを交換してください。
使用するAtomicInteger
代わりにInteger
、問題を解決します。
attendance.get(conferenceHallName).getAndIncrement();
これは、すべてのことを想定しているconferenceHallName
キーが正しくマップに設定されています。