example ejemplo java vector

java - ejemplo - linkedhashmap



Use Hashtable, Vector o HashMap o ArrayList en Java (6)

El problema con Vector y Hashtable es que solo están localmente sincronizados. No se romperán (como en los datos corruptos) en una aplicación simultánea, sin embargo, debido a la sincronización local (por ejemplo, get se sincroniza, pero solo hasta que obtenga devoluciones), querrá realizar su propia sincronización de todos modos para situaciones como como iteración sobre el contenido. Ahora, incluso su método de puesta necesita alguna sincronización adicional para cooperar con la sincronización de iteración y termina con una situación en la que su Hashtable / Vector está doblemente sincronizado.

Un meme que se estresa con el desarrollo de Java siempre usa ArrayList sobre Vector. Vector está en desuso. Eso puede ser cierto, pero Vector y Hashtable tienen la ventaja de que están sincronizados.

Estoy trabajando con una aplicación orientada en gran medida concurrente, ¿no sería beneficioso utilizar objetos que están sincronizados como Vector? Parece que tienen su lugar?


Si necesita ArrayList o HashMap sincronizados, puede envolverlos.

List list = Collections.synchronizedList(new ArrayList(...)); Map m = Collections.synchronizedMap(new HashMap(...));

Personalmente encuentro que los métodos "sincronizados" en estas colecciones no son muy útiles en el código de subprocesos pesados. Hay algunas colecciones más nuevas que ayudan mucho más, pero sobre todo me encuentro haciendo mis propios objetos de sincronización y sincronizando a su alrededor, o usando los nuevos bloqueos en java.util.concurrent


La sincronización tiene su lugar, pero esa no es la única diferencia entre Vector y ArrayList . Vector crece su matriz de almacenamiento interno en una cantidad fija cada vez que excede su capacidad, mientras que ArrayList crece por un factor fijo, que generalmente es un enfoque mucho mejor (dado que da un costo amortizado de O (1) para agregar un artículo) .

También tenga en cuenta que Collections.synchronizedList() se puede utilizar para crear una vista sincronizada en cualquier implementación de List , por lo que no tiene que estar vinculado a las características de Vector (es posible que desee una LinkedList sincronizada, por ejemplo).


Me parece que los únicos momentos en los que necesitarías que la Colección sea segura para hilos son:

  • Si la colección es visible desde fuera de la clase (ámbito público o predeterminado)
  • Si devuelve un identificador a la colección desde un método
  • Si la colección es un miembro estático de tu clase

Todos estos son probablemente una mala idea en cuanto al diseño.

Un mejor enfoque sería hacer que la colección sea Privada o Protegida, y acceder a ella a través de métodos sincronizados. En el caso del miembro estático, si tuviera la necesidad de hacerlo, un Singleton sería una mejor forma de hacerlo.



ConcurrentHashMap es mucho más rápido que Hashtable. Es concurrente , no solo sincronizado. Admite múltiples lectores / escritores a la vez.

Sin embargo, no existe una lista de arreglos ''concurrentes''. Dependiendo de sus necesidades, CopyOnWriteArrayList puede ser o no lo que necesita.