Java Vecteur Fil de sécurité
Est-il un danger, si im en utilisant un Vecteur(java.util.Vecteur) sur mon serveur programme quand im y accéder à partir de plusieurs threads seulement pour la lecture? (myvector .taille() .get() ...) Pour la rédaction de la gi à l'aide de méthodes synchronisées. Merci.
OriginalL'auteur Smarty77 | 2014-04-23
Vous devez vous connecter pour publier un commentaire.
Vecteur est un "thread-safe" de la collection de toutes ses méthodes sont synchronisées. C'est pourquoi il est recommandé d'utiliser ArrayList au lieu - il n'est pas thread-safe, ce qui résulte en une meilleure performance pour un seul fil des applications.
OriginalL'auteur Denis Kulagin
Comme indiqué ci-dessus, chaque méthode unique de
Vector
est thread-safe par sa propre raison desynchronized
modificateurs. Mais, si vous avez besoin de certaines opérations complexes, tels queget()
ouadd()
fondée sur la condition, qui est liée à la mêmevector
, ce n'est pas thread-safe. Voir l'exemple ci-dessous:Ce code est une condition de concurrence entre
size()
etget()
- la taille du vecteur peut être changé par un autre thread après notre fil vérifié le vecteur n'est pas vide, et doncget()
appel peut renvoyer des résultats inattendus. Pour éviter cela, l'exemple ci-dessus doit être modifié comme ceci:Maintenant ce "get-si-non-vide" opération atomique et de la condition de course-gratuit.
OriginalL'auteur Alexey Malev
La java.util.Vecteur méthodes sont toutes synchronisées. Afin de l'utiliser à partir de plusieurs threads est "safe". Vous avez seulement besoin de synchroniser si vous avez besoin d'une lecture-évaluation-processus d'écriture atomique. La synchronisation de vos propres méthodes, il n'est pas nécessairement de rendre votre code thread-safe pour ces scénarios. Si l'état partagé est le Vecteur de l'objet, alors vous avez besoin pour synchroniser sur l'exemple de Vecteur, et non pas sur une instance de vos propres classes.
OriginalL'auteur Ralf
Classe Vector est thread-safe (taille, get, set méthodes sont synchronisés), mais si vous voulez obtenir de meilleures performances, vous devriez essayer d'utiliser
CopyOnWriteArrayList
ouCollections.synchronizedList
à la place.OriginalL'auteur Jakub H