Question

Ai-je besoin de synchroniser ce, lorsque plusieurs threads accédant à la méthode get et un seul thread accède à la méthode setlist?

public class ListContainer {
  private List<String> myList = new ArrayList<String();

  public List<String> get ( )
  {
    return new ArrayList<String>(myList);
  }

  public List<String> set ( )
  {
    this.myList = computeList();
  }
}

Je ne se soucie si les lecteurs obtiennent des données anciennes, mais les données doivent être cohérentes.

Janning

Était-ce utile?

La solution

Vous ne devez pas synchroniser (mais vous devez déclarer myList comme volatile) si les conditions suivantes sont remplies:

  • computeList ne dépend pas de l'état actuel de myList
  • Vous ne modifie pas le contenu de la liste après qu'il a été attribué (Collections.unmodifiableList(computeList()) est la meilleure façon d'exprimer cette condition)

Autres conseils

Non, vous n'avez pas besoin il y a synchronisation. Il n'y a pas de modifications simultanées (si ne marche pas computeList() dépend du myList).

BTW, pourquoi êtes-vous retournerez new ArrayList(myList) au lieu de simplement revenir myList?

Peu importe si computeList dépend myList ou non, tant qu'il n'y a qu'une lecture accès au contenu de myList aucun problème de synchronisation peut se produire.

Si vous n'utilisez pas volatile pour myList alors il peut se produire que retourne le vieux myList, même si strictement défini a déjà remplacé la liste. Si cela ne vous dérange pas cette situation (elle pourrait conduire à deux fils voyant des valeurs différentes), alors vous n'avez pas besoin volatile.

Je préférerais faire la copie implicite

public class ListContainer {

    private final List<String> myList = new CopyOnWriteArrayList<String>();

    public List<String> get (){
      return myList;
    }

    public List<String> set (){
       computeList();
    }
}

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top