1
votes

opération de carte thread-safe

Je suis tombé sur le morceau de code suivant et j'ai noté quelques incohérences - pour un code multi-thread sécurisé.

    Map<String,Map<String,Set<String>> clusters = new HashMap<.........>;
    Map<String,Set<String>> servers = clusters.get(clusterkey);
    if(servers==null){
      synchronized(clusterkey){
       servers = clusters.get(clusterkey);
       if(servers==null){....initialize new hashmap and put...}
      }
    }
    Set<String> users=servers.get(serverkey);
    if(users==null){
      synchronized(serverkey){
       users=servers.get(serverkey);
       if(users==null){ ... initialize new hashset and put...}
      }
    }
    users.add(userid);
  1. Pourquoi la carte serait-elle synchronisée sur la clé de cluster - ne devrait-elle pas être sur la carte en tant que moniteur lui-même?
  2. Les derniers utilisateurs.add ... ne devraient-ils pas également être synchronisés?
  3. Cela semble être beaucoup de code pour ajouter un seul utilisateur de manière thread-safe. Quelle serait une implémentation plus intelligente?


1 commentaires

Il n'y a pas de bien et de mal tant que nous ne connaissons pas le contexte exact. L'extrait de code que vous avez fourni n'est pas suffisant pour nous dire ce que pense l'implémenteur d'origine.


3 Réponses :


1
votes

1 -La synchronisation essaie d'éviter que deux threads, en même temps, créent une nouvelle entrée dans cette carte. Le second doit attendre pour que son (servers == null) ne renvoie pas également true .

2 - Cette liste des utilisateurs semble être hors de portée, mais il semble qu'elle ne nécessite pas de synchronisation. Peut-être que le programmeur sait qu'il n'y a pas d'ID utilisateur dupliqué, ou peut-être qu'il ne se soucie pas de réinitialiser le même utilisateur encore et encore.

3- ConcurrentHashMap peut-être?


0 commentaires