2011-08-02 14 views

Respuesta

10

¿Qué significa cuando decimos que un ArrayList no está sincronizado?

Esto significa que el acceso a una instancia ArrayList de múltiples hilos puede no ser seguro (leer "puede resultar en un comportamiento inesperado" o "puede no funcionar como se anuncia").

Más información:

¿Quiere decir que si declaramos un ArrayList en el ámbito de los objetos, varios subprocesos que acceden a los objetos tienen la oportunidad de modificar la lista?

Incluso si hubiera sido de subprocesos múltiples hilos, serían capaces de modificar la lista.

La diferencia es que si no es seguro para subprocesos y múltiples subprocesos tienen acceso a la lista, todas las apuestas están desactivadas. Decir que la clase no es segura para subprocesos, es lo mismo que agregar "Si se accede desde un hilo a la vez, este método funciona de la siguiente manera ..." delante de cada descripción de método.

1

¿Significa que si declaramos un ArrayList en el ámbito del objeto, los subprocesos múltiples que acceden a los objetos tienen la oportunidad de modificar la lista?

Sí. Si varios hilos operan en él, al mismo tiempo, puede resultar en un comportamiento inesperado

1

Significa que no se garantiza que las instancias de ArrayList sean seguras para la rosca. Esto generalmente incluye tanto acceso de lectura como de escritura. Si lo hace sin sincronización externa, puede dejar el objeto en estados anómalos y obtener un comportamiento difícil de depurar.

0

Estar sincronizado significa que cada operación es segura para subprocesos: si utiliza la misma lista de arreglos de dos subprocesos al mismo tiempo, no pueden dañar el estado. Sin embargo, esto lo hace más lento.

Por ArrayList por defecto no está sincronizado, puede lograrse que por sincronizado palabra clave

ArrayList al=new ArrayList(); 

Collections.synchronized(al); 
2

sincronizada o no, un ArrayList siempre puede ser modificado por varios subprocesos. La sincronización se trata de evitar el acceso concurrente .

Con ArrayList (o colecciones en general) hay dos problemas de simultaneidad.

Primera, no es la sincronización método. Esto significa que todas las llamadas a métodos de una instancia de ArrayList están sincronizadas. Por lo tanto, siempre hay solo un método ejecutado a la vez. Todas las demás llamadas a métodos que se producen mientras el primer método todavía se computa se ponen en cola hasta que se completa el método en ejecución.

sincronización método puede ser asegurada por el embalaje de un ArrayList como esto:

List list = Collections.synchronizedList(new ArrayList()); 

Ejemplo: asumen dos hilos tratan de hacer lo siguiente en el mismo tiempo:

list.add(0, "test"); 

Si tiene una sincronizados lista, se le garantiza que la lista de palabras después comienza con dos entradas de "prueba". Si la lista no está sincronizada, puede obtener una lista con solo una entrada de "prueba" ... u otros resultados inesperados.

Segundo, hay sincronización de instancias. Aquí no solo evitamos las llamadas a métodos simultáneos, sino que nos aseguramos de que solo un hilo tenga acceso al objeto de la lista por un tiempo. Esto es importante si tiene piezas de lógica que requieren que la lista permanezca en un estado sin cambios hasta que se complete la lógica. Por ejemplo, iterar sobre listas. No desea que otros subprocesos agreguen elementos mientras itera sobre una lista.

Este tipo de sincronización se realiza envolviendo su pieza de la lógica con un bloque sincronizado:

synchronized(list) { 
     for (Object o:list) { 
     ... 
     } 
} 
Cuestiones relacionadas