¿Por qué se detiene mi hilo cuando intento acceder a una lista sincronizada?
-
22-07-2019 - |
Pregunta
Por alguna razón, el resultado de esto:
public void msgNeedParts() {
// Blabla...
System.out.println(name + ": Try to print 'tasks'...");
synchronized(tasks) {
System.out.println(name + ": Tasks--" + tasks);
System.out.println(name + ": Did I manage to print it?");
tasks.add(new BinToDump(feeder, binNum));
}
stateChanged();
}
Solo imprime " GantryAgent: Intenta imprimir 'tareas' ... '' pero no ninguno de los siguientes mensajes. Supongo que el hilo de alguna manera 'se atasca' al intentar acceder a la lista sincronizada 'tareas', pero no sé por qué sucede esto.
'tareas' se declararon e inicializaron así:
private List<BinToDump> tasks =
Collections.synchronizedList(new ArrayList<BinToDump>());
¿Alguien puede señalar lo que me falta?
¡Ah! Sospecho que puedo tener un culpable:
/* If nothing left to do, return to original position. */
synchronized (tasks) {
if (tasks.isEmpty()) {
doReturnToOriginalPos();
}
}
En mi planificador (este es un diseño de agente), verifico si 'tareas' está vacío, luego llamo a doReturnToOriginalPos (). ¿Tal vez esto está sucediendo una y otra vez tan rápido que otros métodos no tienen la oportunidad de modificarlo?
¡Ese fue el problema! Seguía siendo llamado tan rápido en mi programador que nada más podía acceder a 'tareas'. ¡Gracias a todos por la ayuda!
Solución
Algo tiene un bloqueo en las tareas. Dependiendo de qué tipo de aplicación sea esta, debería poder obtener un volcado de pila completo del sistema, pero el método varía. Por ejemplo, creo que CTRL-Break en la mayoría de los servidores de aplicaciones basados ??en Windows hará esto, y creo que enviar un SIGQUIT en Linux hará lo mismo.
Una vez que obtiene un volcado de la pila, puede revisarlo para intentar averiguar qué otro hilo tiene un bloqueo en ese objeto.
También puede usar VisualVM para obtener un volcado de pila, para el mismo objetivo final:
Puede usar Java VisualVM para tomar un volcado de subprocesos (seguimiento de pila) mientras un La aplicación local se está ejecutando. Tomar una el volcado de subprocesos no detiene el solicitud. Cuando imprimes el hilo volcar obtienes una copia impresa del hilo pila que incluye estados de subproceso para los hilos de Java.
Cuando imprime un volcado de subprocesos en Java VisualVM, la herramienta imprime una pila rastro de los hilos activos de la solicitud. Usando Java VisualVM para tomar un volcado de hilos puede ser muy conveniente en casos donde no tener una consola de línea de comandos para solicitud. Puedes usar un seguimiento de pila para ayudar a diagnosticar una serie de problemas como puntos muertos o cuando un la aplicación se bloquea.
Otros consejos
¿Es posible que otro hilo tenga un bloqueo de sincronización contra tareas
?