70 votes

Les Collections.synchronizedList et synchronisés

List<String> list = Collections.synchronizedList(new ArrayList<String>());
synchronized (list) {
    list.add("message");
}

Est le bloc "synchronisée (liste){}" vraiment besoin ici ?

99voto

Sam Goldberg Points 2345

Vous n'avez pas besoin de synchroniser que vous mettez dans votre exemple. CEPENDANT, très important, vous avez besoin de synchroniser autour de la liste quand vous de le parcourir (comme indiqué dans la Javadoc):

Il est impératif que l'utilisateur de synchroniser manuellement sur la liste retournée lors de l'itération sur elle:

 Liste liste = Collections.synchronizedList(new ArrayList());
...
 synchronisée(liste) {
 Iterator i = liste.iterator(); // Doit être synchronisé bloc
 alors que (j'.hasNext())
foo(j'.next());
}
 

29voto

NPE Points 169956

Cela dépend du contenu exact de l' synchronized bloc:

  1. Si le bloc effectue une seule opération atomique sur la liste (comme dans votre exemple), l' synchronized est superflu.

  2. Si le bloc effectue plusieurs opérations sur la liste - et le besoin de maintenir le verrou pour la durée de la concession de l'opération , puis l' synchronized est pas superflu. Un exemple courant de ce est de parcourir la liste.

21voto

assylias Points 102015

Le code sous-jacent pour les Collections.synchronizedList ajouter de la méthode est la suivante:

public void add(int index, E element) {
    synchronized (mutex) {list.add(index, element);}
}

Donc dans votre exemple, il n'est pas nécessaire d'ajouter de la synchronisation.

17voto

jpegjpg Points 65

Également Important de noter que toutes les méthodes qui utilisent les Itérateurs par exemple des Collections.sort() devra également être encapsulé à l'intérieur d'un bloc synchronisé.

7voto

snan Points 11

Lire cette Doc Oracle

Il dit: "Il est impératif que l'utilisateur de synchroniser manuellement sur la liste retournée lors de l'itération sur elle"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X