¿Qué es un punto muerto?
Veamos primero un ejemplo de vida: hay un puente en un río, con una cubierta de puente estrecha que solo puede acomodar un automóvil y no puede permitir que dos autos vayan en paralelo. Si dos autos A y B conducen hacia el puente desde ambos extremos del puente, entonces para el automóvil A, cruza una sección de la carretera en el lado izquierdo de la cubierta del puente (es decir, ocupa parte de los recursos del puente). Si quieres cruzar el puente, debes esperar a que Car B renuncie a la cubierta del puente a la derecha. El coche A no puede avanzar en este momento; Para el automóvil B, cruza una sección de la carretera en el lado derecho de la cubierta del puente (es decir, ocupa parte de los recursos del puente). Si desea cruzar el puente, debe esperar a que el automóvil A renuncie a la cubierta del puente a la izquierda, y el automóvil B no puede avanzar en este momento. Los autos en ambos lados no se retiraron, lo que resultó en esperar a que se cayera la cubierta del puente, pero nadie cedió y esperaría sin cesar. Este fenómeno es un punto muerto. Si el automóvil se compara con un proceso y la cubierta del puente se usa como recurso, entonces el problema anterior se describe como: el proceso A posee el recurso R1, esperando el recurso RR ocupado por el proceso B; El proceso B posee recursos RR, esperando el recurso R1 ocupado por el proceso A. Además, los recursos R1 y RR solo permiten ocupar un proceso, es decir, dos procesos no pueden ocupar al mismo tiempo. Como resultado, ninguno de los procesos puede continuar ejecutándose. Si no se toman otras medidas, esta situación de espera de ciclo continuará indefinidamente, y se producirá un punto muerto del proceso.
En los sistemas informáticos, los recursos de software y hardware pueden estar en punto de punto. Por ejemplo: solo hay un controlador CD-ROM y una impresora en el sistema. Un proceso posee el controlador CD-ROM y se aplica para una impresora; El otro proceso posee la impresora y se aplica para un CD-ROM. Como resultado, ambos procesos están bloqueados y nunca se pueden desconectar por su cuenta.
El llamado punto muerto se refiere a una situación en la que múltiples procesos atraviesan los recursos que ocupan y permanecen en un punto muerto indefinidamente. Obviamente, si no hay fuerza externa, entonces todos los procesos involucrados en el punto muerto siempre serán bloqueados. Según el ejemplo anterior, podemos ver que la razón fundamental para los puntos de punto muertos en los sistemas informáticos son recursos limitados y operaciones inadecuadas. Es decir: una razón es que el sistema proporciona muy pocos recursos y está lejos de cumplir con los requisitos de recursos de los procesos concurrentes. Este punto muerto causado por recursos competitivos es el núcleo de nuestra discusión. Por ejemplo: el mensaje es un recurso temporal. En algún momento, el proceso A está esperando un mensaje enviado por el proceso B, el proceso B está esperando un mensaje enviado por el proceso C, y el proceso C está esperando un mensaje enviado por el proceso A. Si el mensaje no ha llegado, ninguno de los tres procesos A, B y C no pueden avanzar, y los estlocks también ocurrirán en la comunicación del proceso. Otra razón son los puntos muertos causados por la orden inapropiada de avance del proceso. Los recursos pequeños pueden no necesariamente conducir a puntos muertos. Al igual que dos personas que cruzan un puente de un solo plan, si ambos tienen que pasar primero y están en punto de la puente de un solo plan, inevitablemente conducirán a un punto muerto para los recursos de competencia; Sin embargo, si dos personas primero verifican si hay otras personas en el puente antes de ir al puente, y solo suben por el puente por sí mismas cuando no hay otras personas en el puente, entonces el problema se resolverá. Por lo tanto, si el programa se diseña de manera injustificada y el proceso se promueve de manera inapropiada, también causará puntos muertos.
Punto muerto
Solo cuando el hilo T1 ocupa O1 y también requiere O2, y T2 toma O2 en este momento y también requiere O1, habrá un punto muerto. (Similar a dos personas que comen con dos palillos, ambos necesitan un palillo de la otra fiesta para comer)
El siguiente código: el hilo T1 ocupa O1 y solo se libera O1 después de obtener el objeto O2. El hilo T2 ocupa primero O2 y luego adquiere O1. En este momento, O1 está ocupado por el hilo T1, O2 está ocupado por el hilo T2, T1 y T2 están esperando infinitamente, y se producirá un punto muerto.
paquete javasimple;/** * Deadlock demo * @author haokui * */public class Diesynchronized {public static void main (string [] args) {/** * Crear e iniciar dos hilos t1 y t2. Ambos hilos deben compartir dos objetos O1 y O2*/ Object o1 = new Object (); Objeto o2 = nuevo objeto (); Hilo t1 = nuevo hilo (nuevo T1 (O1, O2)); Hilo t2 = nuevo hilo (nuevo T2 (O1, O2)); t1.start (); t2.start (); }} // crear dos clases de hilo T1 implementos runnables {objeto o1; Objeto O2; public t1 (objeto o1, objeto o2) {this.o1 = o1; this.o2 = o2; } public void run () {// bloquea O1 y O2 sincronizado (o1) {try {thread.sleep (1000); } Catch (InterruptedException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } sincronizado (o2) {system.out.println ("o2"); }}}}}}}} La clase T2 implementa runnable {objeto o1; Objeto O2; public t2 (objeto o1, objeto o2) {this.o1 = o1; this.o2 = o2; } public void run () {sincronizado (o2) {try {thread.sleep (1000); } Catch (InterruptedException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } sincronizado (O1) {System.out.println ("O1"); }}}} Nota: La concurrencia ocurre solo cuando se comparten O1 y O2. Se pueden compartir dos objetos a través de constructores.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.