java Vecteur et le fil de sécurité
Je me demandais si ce code va faire toute la difficulté:
J'ai un vecteur qui est partagée entre plusieurs threads. Chaque fois qu'un thread a pour ajouter/enlever des choses à partir du vecteur-je le faire en vertu d'une synchronized
bloc. Cependant, le thread principal est un appel:
System.out.println("the vector's size: "+ vec.size());
ce qui n'est pas synchronized
.
Si cela cause des problèmes?
En aparté, vous devriez enclin à utiliser le JDK 1.2 les Collections de l'API (ArrayList ou LinkedList), en liaison avec les Collections.synchronizedList(Liste) pour faire leur synchronisation. Vecteur est obsolète (avec table de hachage (Hashtable).
Merci pour votre commentaire, qui m'a beaucoup aidé (bien que 3 ans)! 😉
Merci pour votre commentaire, qui m'a beaucoup aidé (bien que 3 ans)! 😉
OriginalL'auteur Guy | 2009-11-01
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous faites référence à
java.util.Vector
.Fait
Vector.size()
est synchronisé et sera de retour à une valeur compatible avec le vecteur d'état (lorsque le thread appelantsize()
entre le moniteur.) Si elle renvoie 42, puis à un certain point dans le temps du vecteur contenues exactement 42 éléments.Si vous êtes en train d'ajouter des éléments dans une boucle dans un autre thread, alors vous ne pouvez pas prédire la taille exacte, mais il devrait être bon pour des fins de surveillance.
OriginalL'auteur finnw
Toutes les méthodes sont synchronisés eux-mêmes, tant et aussi longtemps que vous êtes seulement de synchronisation autour d'une seule méthode, votre propre synchronisation n'est pas nécessaire. Si vous avez plusieurs appels de méthode, de qui dépendent les uns des autres, par exemple, quelque chose comme
vec.get(vec.size()-2)
pour obtenir l'avant-dernier élément, vous devez utiliser votre propre synchronisation car, autrement, le vecteur peut changer entre vec.taille() et vec.get().OriginalL'auteur jarnbjo
Chacune des méthodes de
java.util.Vector
estsynchronized
, de sorte que cela ne causera pas de problèmes pour quelque chose qui est juste de la connexion la taille.Pour améliorer les performances, vous pouvez être mieux que le remplacement de vos
Vector
avec unArrayList
. Les méthodes deArrayList
ne sont passynchronized
, de sorte que vous devez synchroniser tous les accès.Dans de nombreux cas, une seule méthode de synchronisation est insuffisante, de sorte que vous avez à faire votre propre synchronisation de toute façon. À l'aide de Vecteurs, vous seriez alors en fin de la synchronisation de deux fois.
Comment beaucoup d'impact sur les performances attendez-vous de la "double" de la synchronisation si vous mettre en place quelque chose comme
synchronized(vec) {vec.get(vec.size()-2);}
?Si vous synchronisez manuellement sur le vecteur lui-même, alors que la surcharge est négligeable. Si vous êtes à la synchronisation sur un autre objet, alors il n'y a plus d'un rétroprojecteur (je viens de faire quelques tests rapides qui montrent ArrayList, à environ 25% plus rapide dans cette situation sans fil de contention).
OriginalL'auteur Phil Ross
L'esprit que vous pouvez toujours obtenir une version synchronisée d'une collection en utilisant
Collections.synchronizedCollection(Collection<T> c)
méthode statique..OriginalL'auteur Jack