Punto muerto
El tornillo es una herramienta muy útil con muchas aplicaciones porque es muy simple de usar y fácil de entender. Pero al mismo tiempo, también traerá algunos problemas, es decir, puede causar un punto muerto. Una vez que se produce un punto muerto, las funciones del sistema no estarán disponibles. Primero veamos un trozo de código, que causará puntos muertos, causando que Thread Thread_1 y Thread Thread_2 esperen mutuamente para liberar el bloqueo.
paquete hilo; public class DeadLockDemo {private static string a = "a"; private static string b = "b"; public static void main (string args []) {new DeadLockDemo (). Deadlock ();} private void wadlock () {// horthift_1 thread thread_1 = new hilo (new Runnable () {@@@@@@@@@@@Override run () {) {) {) {) {System.err.println ("-Thread_1 Lock A ----"); Synchronized (b) {System.err.println ("-Thread_1 Lock B -----");}}}}); // Thread Thread_2 Thread_2 = New Thread (New RunNable () {@Override Public Void Run () {SynChronized (B Thread_2 Thread_2 = New Thread (New Runnable () {@Override Public Void Run () {SynChronized (B Thread_2 Thread_2 = New Thread (New Runnable () {@Override Public Void Run () {SynChronized (B Thread 8 {System.out.println ("-Thread_2 Lock B -----"); Synchronized (a) {System.out.println ("-Thread_2 Lock A ----");}}}); thread_1.start (); Thread_2.start ();}}}Este código es solo una demostración de escenarios de punto muerto, y en realidad no puede escribir dicho código. Pero en algunos escenarios más complejos, puede encontrar tales problemas, como Thread_1 no ha lanzado el cable porque algunas situaciones anormales (bucle muerto). O Thread_1 obtiene un cable de base de datos, y se lanza una excepción al liberar el bloqueo, pero no se libera.
Una vez que ocurre un punto muerto, el negocio es perceptible porque no se puede proporcionar el servicio. Entonces solo puede verificar qué hilo tiene el problema a través del hilo de volcado. La siguiente información del hilo nos dice que las líneas 35 y 21 de la clase Deadlockdemo causaron el punto muerto.
"Thread -1" prio = 6 TID = 0x000000000CB13800 nid = 0x19ac esperando la entrada del monitor [0 x0000000000000D67F000] java.lang.thread.state: bloqueado (en el monitor de objetos) en Thread.Deadlockdemo $ 2.run (DeadlockDema.Java:35) - a la espera de bloquear <0x00000007D5A java.lang.string) - Bloqueado <0x00000007D5A9BEB8> (a java.lang.string) en java.lang.thread.run (fuente desconocida) "Thread -0" Prio = 6 Tid = 0x000000000000CB0E800 nid = 0x6bc esperando la entrada del monitor [0x 0000000D48F000] java.lang.thread.state: bloqueado (en el monitor de objeto) en thread.deadlockdemo $ 1.run (deadlockdemo.java:21) - esperando bloquear <0x00000007d5a9beb8> (un java.lang.string) - bloqueado <0x00000007D5A9Be88> (a java.lang.string) java.lang.thread.run (fuente desconocida)
Varias formas comunes de evitar el punto muerto.
Evite adquirir múltiples bloqueos al mismo tiempo que un hilo.
Evite un hilo que ocupa múltiples recursos al mismo tiempo en la cuerda e intente asegurarse de que cada cuerda solo consuma un recurso.
Intente usar la búsqueda cronometrada, usando Lock.trylock (Tiempo de espera) en lugar de usar el mecanismo de búsqueda interna.
Para los cables de la base de datos, el bloqueo y el desbloqueo deben estar en una conexión de base de datos, de lo contrario, el desbloqueo fallará.
referencia:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
Resumir
Lo anterior es el análisis completo del código de los métodos comunes de Java para evitar los puntos muertos en este artículo. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!