¿Por qué se detiene mi hilo cuando intento acceder a una lista sincronizada?

StackOverflow https://stackoverflow.com/questions/1824768

  •  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!

¿Fue útil?

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 ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top