El borde Vector clase tiene sobre ArrayList es que está sincronizada y por lo tanto asegura hilo de seguridad. Sin embargo, entre CopyOnWriteArray y Vector, lo que debería ser el preferido teniendo en cuenta la seguridad y el rendimiento del hilo en consideración.
Respuesta
En general, depende de la frecuencia y naturaleza de las operaciones de lectura y escritura, y del tamaño de la matriz.
Necesitará referencia en su contexto para estar seguro, pero aquí hay algunos principios generales:
- Si usted es sólo va a leer el gama, a continuación, incluso ArrayList es seguro para subprocesos (dado que las únicas modificaciones que no son seguras para hilos son las que modifican la lista). Por lo tanto, le conviene usar una estructura de datos no sincronizada , ya sea ArrayList o CopyOnWriteArrayList probablemente funcione igual de bien.
- Si lecturas son mucho más comunes en comparación con las escrituras entonces habría tienden a preferir CopyOnWriteArrayList, ya que la sobrecarga gama de copia es única incurrido en las escrituras.
- Si el tamaño de la matriz es pequeña, a continuación, el costo de hacer copias de matriz también será pequeña, por lo tanto Esto favorecerá CopyOnWriteArrayList sobre Vector.
También es posible que desee considerar otras dos opciones:
- usar un ArrayList, pero puso la sincronización otra parte para garantizar la seguridad hilo. Este es en realidad el método que uso más a menudo, básicamente, la idea es utilizar un bloqueo separado de nivel superior para proteger todas las estructuras de datos relevantes al mismo tiempo. Esto es mucho más eficiente que tener sincronización en cada operación individual como lo hace Vector.
- Considere un inmutable persistent data structure - se garantiza que son seguros para hilos debido a la inmutabilidad, no requieren sincronización y también se benefician de una sobrecarga (es decir, comparten la mayoría de los datos entre instancias diferentes en lugar de hacer copias completas). Los lenguajes como Clojure los utilizan para obtener un rendimiento similar al de ArrayList al tiempo que se garantiza la seguridad de los hilos completos.
Depende del patrón de uso; si tiene muchas más lecturas que escrituras, use CopyOnWriteArrayList
, de lo contrario, use Vector
.
Vector
introduce un pequeño retraso de sincronización para cada operación, cuando CopyOnWriteArrayList
tiene un retraso más largo para la escritura (debido a la copia) pero no hay retraso para las lecturas.
Otra consideración es el comportamiento de los iteradores: Vector
requiere sincronización explícita cuando lo itera (para que las operaciones de escritura no se puedan ejecutar al mismo tiempo), CopyOnWriteArrayList
no.
- 1. vector o mapa, ¿cuál usar?
- 2. ¿Es seguro el hilo std :: vector o boost :: vector?
- 3. Java Vector o ArrayList for Primitives
- 4. Cómo filtrar o "grep" un vector C++?
- 5. std vector C++ - copia profunda o superficial
- 6. XAML Vector to Illustrator o similar
- 7. rellenando un vector o matriz de impulso
- 8. Uso Hashtable, Vector o HashMap o ArrayList en Java
- 9. Vector de Inicialización de Vector
- 10. Borrado vector :: final a partir del vector
- 11. C++ ampliar un vector con otro vector
- 12. std :: vector inserta una copia o referencia de un objeto?
- 13. ¿Qué significa cuando decimos que Hashtable o Vector está sincronizado?
- 14. auto de const std :: vector <> &; objeto o referencia?
- 15. #include <vector> tal archivo o directorio
- 16. Iteración a través de un vector scipy.sparse (o matriz)
- 17. Inicializando la matriz de impulso con std :: vector o array
- 18. Agregando o eliminando elementos de manera eficiente a un vector o lista en R?
- 19. inicializando un vector de vector <doubles> C++
- 20. Implementación de Vector Clock
- 21. permutación de un vector
- 22. C++ vector :: claro
- 23. Cython vector operations
- 24. sizeof() std :: vector (C++)
- 25. return determinant vector - Matlab
- 26. sizeof() un vector
- 27. Iterar std :: vector múltiple
- 28. vector iteradores de reparto
- 29. AS3 Vector de matrices
- 30. C++ Get Vector type
Además, considere el uso de Collections.synchronizedList para ajustar una Lista no segura para subprocesos, en lugar de hacer sincronizaciones externas – barjak
"use un bloqueo independiente de nivel superior ... Esto es mucho más ** eficiente ** que tener sincronización en cada operación individual "-> conveniente, pero eficiente? Creo que un bloqueo de nivel superior es exactamente lo opuesto a eficiente. – Kashyap
"use un bloqueo separado de alto nivel ... Esto es mucho más ** eficiente ** que tener sincronización en cada operación individual" -> Conveniente, pero eficiente? Creo que un bloqueo de nivel superior es exactamente lo opuesto a eficiente. – Kashyap