2010-10-12 16 views
7

All,CopyOnWriteArray o Vector

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

8

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.
+0

Además, considere el uso de Collections.synchronizedList para ajustar una Lista no segura para subprocesos, en lugar de hacer sincronizaciones externas – barjak

+0

"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

+0

"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

7

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.