El fenómeno de interbloqueo de subprocesos múltiples en Java y demostrar un caso de interbloqueo


Prefacio

El punto muerto es un contenido importante en el subproceso múltiple de Java, por lo que la comprensión del punto muerto es muy importante. Durante la entrevista, a menudo se pide a los programadores que escriban un caso de punto muerto.

1. ¿Qué es un punto muerto?

  • Pongamos un ejemplo en la vida: los chinos comen con extranjeros, los chinos usan palillos chinos y los extranjeros usan tenedores para terminar la comida sin problemas.
  • Entonces, ¿qué es un fenómeno de punto muerto? Si el extranjero sostiene los palillos y los chinos sostienen el tenedor, y ninguno de ellos se lo da a nadie, entonces habrá un punto muerto y nadie podrá comer.
  • Una vez que se produce el interbloqueo, no habrá excepciones ni avisos, pero todos los hilos se bloquearán y no podrán continuar.

Dos, caso de punto muerto

  1. Cree una interfaz LockUtils
public interface LockUtils {
    
    
    Object Obj1 = new Object();
    Object Obj2 = new Object();
}

  1. Programa principal
public class 死锁现象 implements LockUtils {
    
    
    public static void main(String[] args) {
    
    
        MyThread10 th1 = new MyThread10(true);
        MyThread10 th2 = new MyThread10(false);
        th1.start();
        th2.start();

    }

}
class  MyThread10 extends Thread {
    
    
    private boolean flag;

    public MyThread10(boolean flag) {
    
    
        this.flag = flag;
    }

    @Override
    public void run() {
    
    
        if (flag) {
    
    
        //同步代码块嵌套
            synchronized (LockUtils.Obj1) {
    
    
                System.out.println("true线程持有obj1锁,进来了");
                synchronized (LockUtils.Obj2) {
    
    
                    System.out.println("true线程持有obj2锁,进来了");
                }
            }

        } else {
    
    
            synchronized (LockUtils.Obj2) {
    
    
                System.out.println("false线程持有obj2锁,进来了");
                synchronized (LockUtils.Obj1) {
    
    
                    System.out.println("false线程持有obj1锁,进来了");
                }

            }

        }
    }
}

Resultado en ejecución: el
Inserte la descripción de la imagen aquí
hilo verdadero toma el bloqueo obj1 y genera la declaración. El hilo falso toma el bloqueo obj2 y genera la declaración. Ambos subprocesos están esperando que se libere el recurso, y el recurso está bloqueado por otro subproceso, lo que hace que cada subproceso espere a que el subproceso de destino libere su bloqueo, lo que da como resultado un punto muerto.

Supongo que te gusta

Origin blog.csdn.net/m0_46988935/article/details/112896652
Recomendado
Clasificación