2011-05-24 17 views
7

Tengo una pregunta general sobre la lista sincronizada.
supongamos que en el constructor estoy createing una listajava - general synchronizedList pregunta

List synchronizedList = Collections.synchronizedList(list); 

y tengo un método agrega un objeto a la lista.

public void add(String s){ 
    synchronizedList.add(s) 
} 

Hay otro hilo que comprueba cada pocos segundos si hay algunas filas, lo descarga en un archivo y se los elimina.

Ahora digamos que repito cada fila y la guardo en la base de datos. después de toda iteración borro la lista.

¿Cómo me ayuda el soporte multitoma?
Podría agregar un elemento a la lista justo antes de que aparezca clear() en el otro subproceso.
A menos que administre el bloqueo yo mismo (que realmente no necesito una lista sincronizada para eso) yo mismo.

+0

Como todas las tres respuestas indican, la lista sincronizada significa que todas las operaciones en esa lista se garantiza que son atómicas o garantizan el acceso en serie a las llamadas a métodos individuales. Tenía que preguntarle a mi colega qué significa eso. Por lo tanto, significa que las operaciones en Lista como (desde el fragmento de código anterior) 'synchronizedList.size()' y 'synchronizedList.add (s)' no pueden estar en paralelo. Esto no es obvio para algunas personas que están leyendo este hilo. Así que aunque agreguemos para ayudar a otros que no entienden. Gracias @ WhiteFang34, @ jb-nizet y @khachik por las explicaciones a continuación. –

Respuesta

13

La lista sincronizada devuelta por Collections no ayudará en su caso. Solo es bueno si necesita garantizar el acceso en serie a las llamadas a métodos individuales. Si necesita sincronizar alrededor de un conjunto de operaciones más grande, entonces debe ajustar manualmente ese código en un bloque synchronized. El Javadoc estados:

Es imprescindible que el usuario se sincronice manualmente en la lista devuelta al iterar sobre él.

Si su lista se utiliza en otro lugar, al menos puede protegerla de llamadas a métodos individuales que de otro modo no serían seguras para subprocesos. Sin embargo, si está administrando completamente la lista, puede simplemente agregar un bloque synchronized al método add y usar el mismo bloqueo que usará al iterar sobre él.

13

synchronizedList de hecho solo garantiza que todas las llamadas a métodos en la lista estén sincronizadas. Si necesita realizar múltiples operaciones de forma sincronizada, debe manejar la sincronización usted mismo.

Por cierto, esto se dice explícitamente en el javadoc for Collections.synchronizedList:

Es imperativo que el usuario sincronizar manualmente en la lista devuelto cuando se itera sobre él:

List list = Collections.synchronizedList(new ArrayList()); 
     ... 
    synchronized(list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 
4

lista sincronizada significa que todas las operaciones en esa lista se garantiza que son atómicas. El escenario que describe requiere tener algún bloqueo fuera de la lista. Considere los semáforos o el bloqueo synchronized para implementar monitores. Eche un vistazo al java.util.concurrent.