Pourquoi il ne faut pas utiliser les Vector en java

Publié le 10 Novembre 2011

J'ai souvent entendu dire qu'il ne fallait pas utiliser la classe Vector en java mais personne ne m'avait vraiment donné d'explication convaincante, hors je viens de trouver l'explication dans le livre de Brian Goetz "Java concurrency in practice".

 

La classe Vector est une classe dont toutes les méthodes sont "synchronized" ce qui assure qu'il n'y a qu'un seul thread qui éxecute une méthode à la fois.

 

Mais cette condition ne suffit pas à rendre la classe Thread-safe pour autant comme le montre l'exemple suivant:

 

if(!myVector.contains(myObject)){
   myVector.add(myObject);
}

 

Dans cet exemple on essaie de s'assurer qu'il n'y aura pas de doublons dans mon objet Vector. Ceci marche très bien avec un seul thread mais dès qu'on pense dans un environnement multi-thread on ne peut plus garantir cette condition.

 

Rien n'empêche qu'un thread éxecute myVector.contains() puis un deuxième éxecute aussi myVecor.contains() avec le même objet. Dans ce cas 2 threads différents vont insérer myObject dans myVector et l'unicité du contenu ne sera plus garanti.

 

En fait il faudrait que la méthode contains() et la méthode add() constitue une seule opération mais ce n'est pas le cas. Donc ce cas peut arriver, tout dépend du scheduler de la JVM, chose qu'on ne contrôle pas.

 

Bref en environnement multi-thread la classe Vector n'est pas satisfaisante car il faut gérer soit même les blocs synchronized. Et en mode mono-thread on a toujours l'aquisition du lock (dans ce cas inutile), ce qui affecte d'autant les performances.

 

Pour résumer il est préférable d'utiliser une implémentation de java.util.List.

Attention cependant à bien choisir l'implémentation en fonction de l'environnement: mutli ou mono thread. Par exemple la classe ArrayList n'est pas thread safe mais elle sera parfaite en environnement mono-thread car elle ne contient pas de synchronized.

Rédigé par Bliz

Publié dans #Java

Repost 0
Commenter cet article

Gloria 11/01/2013 18:48


MErci pour l'explication  très claire