Liste synchronisée Java pour la boucle
Documentation sur synchronizedList états qui,
Il est impératif que l'utilisateur de synchroniser manuellement sur la liste retournée lors de l'itération:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); //Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
Le non respect de ces conseils peut entraîner un comportement non déterministe.
Cela semble assez clair, mais je voulais juste confirmer que pour chaque boucle est interdite. Par exemple, je ne peux pas faire quelque chose comme comme suit juste?
List<MyType> list = Collections.synchronizedList(new ArrayList(<MyType>));
...
synchronized(list){
for(MyType m : list){
foo(m);
m.doSomething();
}
}
source d'informationauteur user927476
Vous devez vous connecter pour publier un commentaire.
Oui, vous peut - optimisé pour la boucle est essentiellement la même que votre code qui utilise explicitement l'itérateur. Il revient au même code, il est juste d'appeler
iterator()
et puis alternance entrenext()
ethasNext()
appels.Vous pouvez le faire. La boucle foreach compile à (presque) la même bytecode comme la boucle while. Les touches sont:
Bien sûr, vous pouvez, le seul problème que je vois ici est un problème de performances, si votre méthode
dosomething()
oufoo(m)
sont coûteux à exécuter, vous aurez un coût de performance. La taille de votre collection est également important à prendre en compte lors de la boucle dans un bloc synchronisé, en raison du fait que, lorsqu'un thread acquérir le verrou, tandis que dans le bloc synchronisé, en boucle dans une énorme collection de pousser les autres threads d'attendre.Si possible, vous pouvez envisager d'utiliser l'immutabilité plutôt que de synchronisation.
http://docs.guava-libraries.googlecode.com/git-history/release09/javadoc/com/google/common/collect/ImmutableList.html