que está sincronizando dos veces, lo que no tiene sentido y, posiblemente, se ralentiza el código: cambios, mientras que la iteración en la lista necesitan un synchronnization lo largo de toda la operación , lo que está haciendo con synchronized (in_queue_list)
Usar Collections.synchronizedList()
es superfluo en ese caso (crea un contenedor que sincroniza las operaciones individuales).
Sin embargo, como está vaciando la lista por completo, la eliminación iterada del primer elemento es la peor manera posible de hacerlo, sice para cada elemento se deben copiar todos los elementos siguientes, haciendo esto un O (n^2) operación - terriblemente lento para listas más grandes.
En su lugar, simplemente llame al clear()
- no es necesario iterar.
Editar: Si necesita la sincronización de un solo método de Collections.synchronizedList()
más adelante, entonces esta es la forma correcta:
List<Record> in_queue_list = Collections.synchronizedList(in_queue);
in_queue_list.clear(); // synchronized implicitly,
Pero en muchos casos, la sincronización de un solo método es insuficiente (por ejemplo, para todas las iteraciones, o cuando obtiene un valor, haga cálculos basados en él y reemplácelo con el resultado). En ese caso, debe usar la sincronización manual de todas formas, así que Collections.synchronizedList()
es una sobrecarga adicional inútil.
No se puede actualizar realmente una lista para que se sincronice porque se le está pasando una referencia, por lo que realmente no la posee. Lo que sea que le haya dado la referencia aún podría modificar la lista original que le pasó al mismo tiempo. Independientemente de la sincronización que agregue, a menos que se sepa explícitamente que la lista estará protegida por su bloqueo intrínseco. –
Voy a poner un bloque sincronizado alrededor de cualquier operación en la cola. ¡Gracias! – bob