Prioridad del hilo de Java <Br /> El tipo especial de error relacionado con la multitarea que debe evitarse es un punto muerto. El punto muerto ocurre cuando dos hilos tienen una dependencia circular de un par de objetos sincrónicos. Por ejemplo, suponga que un hilo ingresa a la tubería del objeto X y otro hilo ingresa a la tubería del objeto Y. Si el hilo de X intenta llamar al método de sincronización de Y, se bloqueará como se esperaba. El hilo Y también quiere llamar a algunos métodos de sincronización de X, y el hilo espera para siempre, porque para alcanzar X, debe liberar su propio bloqueo de y para completar el primer hilo. Deadlock es un error muy difícil de depurar porque:
Por lo general, ocurre raramente, y solo ocurre cuando el período de tiempo de los dos hilos solo coincide.
Puede contener más de dos hilos y objetos sincrónicos (es decir, los puntos muertos pueden ocurrir cuando hay secuencias más complejas de eventos que el ejemplo que acabamos de describir).
Para comprender completamente el punto muerto, es útil observar su comportamiento. El siguiente ejemplo genera dos clases, A y B, con métodos foo () y bar () respectivamente. Estos dos métodos tienen una breve pausa antes de llamar a los métodos de otras clases. La clase principal, llamada Deadlock, crea instancias de A y B, y luego comienza un segundo hilo para configurar un entorno de punto muerto. Los métodos foo () y bar () usan el sueño () para forzar el punto muerto.
// un ejemplo de Deadlock.Class A {sincronizado void foo (b b) {string name = thread.currentThread (). GetName (); Thread .sleep (1000); (); System .out.println (nombre + "ingresado B.Bar"); n (Nombre + "Intentando llamar a A.Last ()"); {A a = nuevo A (); () Obtenga bloqueo en B en otro hilo. Después de ejecutar el programa, la salida es la siguiente:
MainThread ingresó a A. FoorAcingThread entró en B.Barmainthread intentando llamar a B.Last () RacingThread intentando llamar a A.Last ()
Debido a que el programa está bloqueado, debe presionar CTRL-C para finalizar el programa. Presione el descanso CTRL en la PC (o presione CTRL-/ In Solaris) y puede ver el hilo completo y el montón de búfer de tuberías. Verá que RacingThread ocupa el proceso de gestión B mientras espera el proceso de gestión A, y al mismo tiempo, MainThread ocupa una espera para el proceso de gestión b. El programa nunca terminará. Como ilustra este ejemplo, su programa multiproceso a menudo está bloqueado, y Deadlock es el primer problema que debe verificar.
Java Treat Deadlock <Br /> El tipo especial de error relacionado con la multitarea que debe evitarse es un punto muerto. El punto muerto ocurre cuando dos hilos tienen una dependencia circular de un par de objetos sincrónicos. Por ejemplo, suponga que un hilo ingresa a la tubería del objeto X y otro hilo ingresa a la tubería del objeto Y. Si el hilo de X intenta llamar al método de sincronización de Y, se bloqueará como se esperaba. El hilo Y también quiere llamar a algunos métodos de sincronización de X, y el hilo espera para siempre, porque para alcanzar X, debe liberar su propio bloqueo de y para completar el primer hilo. Deadlock es un error muy difícil de depurar porque:
Por lo general, ocurre raramente, y solo ocurre cuando el período de tiempo de los dos hilos solo coincide.
Puede contener más de dos hilos y objetos sincrónicos (es decir, los puntos muertos pueden ocurrir cuando hay secuencias más complejas de eventos que el ejemplo que acabamos de describir).
Para comprender completamente el punto muerto, es útil observar su comportamiento. El siguiente ejemplo genera dos clases, A y B, con métodos foo () y bar () respectivamente. Estos dos métodos tienen una breve pausa antes de llamar a los métodos de otras clases. La clase principal, llamada Deadlock, crea instancias de A y B, y luego comienza un segundo hilo para configurar un entorno de punto muerto. Los métodos foo () y bar () usan el sueño () para forzar el punto muerto.
// un ejemplo de Deadlock.Class A {sincronizado void foo (b b) {string name = thread.currentThread (). GetName (); Thread .sleep (1000); (); System .out.println (nombre + "ingresado B.Bar"); n (Nombre + "Intentando llamar a A.Last ()"); {A a = nuevo A (); () Obtenga bloqueo en B en otro hilo. Después de ejecutar el programa, la salida es la siguiente:
MainThread ingresó a A. FoorAcingThread entró en B.Barmainthread intentando llamar a B.Last () RacingThread intentando llamar a A.Last ()
Debido a que el programa está bloqueado, debe presionar CTRL-C para finalizar el programa. Presione el descanso CTRL en la PC (o presione CTRL-/ In Solaris) y puede ver el hilo completo y el montón de búfer de tuberías. Verá que RacingThread ocupa el proceso de gestión B mientras espera el proceso de gestión A, y al mismo tiempo, MainThread ocupa una espera para el proceso de gestión b. El programa nunca terminará. Como ilustra este ejemplo, su programa multiproceso a menudo está bloqueado, y Deadlock es el primer problema que debe verificar.