Vector
synchronise sur chaque opération individuelle. C'est presque jamais ce que vous voulez faire.
Généralement, vous voulez synchroniser une séquence entière d'opérations. Synchroniser des opérations individuelles est à la fois moins sûr (si vous itérez sur un Vector
, par exemple, vous devez toujours prendre un verrou pour éviter que quelqu'un d'autre ne change la collection en même temps, ce qui provoquerait une ConcurrentModificationException
dans le thread d'itération) mais aussi plus lent (pourquoi prendre un verrou à plusieurs reprises quand une fois suffit) ?
Bien sûr, cela a aussi le surcoût de verrouiller même lorsque ce n'est pas nécessaire.
Fondamentalement, c'est une approche très défectueuse de la synchronisation dans la plupart des situations. Comme l'a souligné M. Brian Henk, vous pouvez décorer une collection en utilisant des appels tels que Collections.synchronizedList
- le fait que Vector
combine à la fois l'implémentation de collection "tableau redimensionné" avec le bit "synchroniser chaque opération" est un autre exemple de mauvaise conception ; l'approche de la décoration donne une meilleure séparation des préoccupations.
Quant à un équivalent de Stack
- je regarderais du côté de Deque
/ArrayDeque
pour commencer.
1 votes
Ils sont obsolètes, mais ils ne sont pas obsolètes.