Comment effectuer une opération sécurisée en cas d'opération sur une carte de hachage concomitante? (Même chose comme putIfAbsent)Java ConcurrentHashMap atomique get si présent
exemple Bad, pas très thread-safe (cocher agir alors la situation):
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;
}
Un autre mauvais exemple serait:
public boolean setOption(String id, Object option){
if (concMap.contains(id)){
concMap.get(id).setOption(option);
return true;
}
return false;
}
La chose souhaitable est ici pas goulot d'étranglement l'ajout, supprimer et obtenir des opérations en les synchronisant.
Merci
Je ne comprends pas votre commentaire sur "cet appel setOption" - à quelle méthode setOption faites-vous référence? Vous en avez deux dans votre code. –
C'est juste une méthode de jeu générique sur un objet générique qui est stocké dans la carte. – cdmihai
Votre deuxième exemple serait défectueux si les paires clé-valeur pouvaient être retirées de la carte. Cela pourrait arriver entre le test contient et le get. –