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) {
...
}
}