コンカレント・ハッシュ・マップで現在の操作の場合、どのように安全な取得を実行しますか? (putIfAbsentのように同じもの)Java ConcurrentHashMapアトミック・ゲット(存在する場合)
悪い例、安全ではありません非常にスレッド(状況として作用し、その後チェック):
ConcurrentMap<String, SomeObject> concMap = new ...
//... many putIfAbsent and remove operations
public boolean setOption(String id, Object option){
SomeObject obj = concMap.get(id);
if (obj != null){
//what if this key has been removed from the map?
obj.setOption(option);
return true;
}
// in the meantime a putIfAbsent may have been called on the map and then this
//setOption call is no longer correct
return false;
}
はもう一つの悪い例は次のようになります。
public boolean setOption(String id, Object option){
if (concMap.contains(id)){
concMap.get(id).setOption(option);
return true;
}
return false;
}
ここで望ましいものはでありそれらを同期させることによって、追加、削除、および操作をボトルネックにすることはありません。 containsKey
/get
、ちょうどget
を呼び出す
おかげ
「このsetOption呼び出し」についてのご意見はありません。どのsetOptionメソッドを参照していますか?あなたのコードに2つあります。 –
これはマップに格納されている一般的なオブジェクトの汎用的な設定メソッドです。 – cdmihai
2つ目の例では、キーと値のペアがマップから削除される可能性があります。これは、包含テストと取得の間に起こる可能性があります。 –