[Pregunta de la entrevista de Java] ¿Qué es un punto muerto? Explique con el código.

¿Qué es un punto muerto? Explique con el código.

Concepto de interbloqueo:

Dos / múltiples subprocesos adquieren otros bloqueos con la premisa de ocupar el bloqueo, lo que hace que los subprocesos esperen en un bucle infinito, ¡lo que resulta en un punto muerto!

Condiciones de interbloqueo:

Condiciones necesarias para el punto muerto

① Condiciones mutuamente excluyentes: se refiere al uso exclusivo de los recursos asignados por el proceso, es decir, un determinado recurso es ocupado por un solo proceso dentro de un período de tiempo. Si hay otros procesos que solicitan recursos en este momento, el solicitante solo puede esperar hasta que el proceso que ocupa los recursos se agote y se libere.
② Condiciones de solicitud y retención: se refiere al proceso que ha retenido al menos un recurso, pero ha realizado una nueva solicitud de recurso y el recurso ya está ocupado por otros procesos, en este momento el proceso de solicitud está bloqueado, pero está retenido a otros recursos que ya ha obtenido.
③ Condición de no privación: Se refiere a los recursos que ha adquirido el proceso, no pueden ser privados antes de que se agoten, solo pueden ser liberados por sí mismos cuando se agoten.
④ Condición de espera de bucle: cuando se produce un punto muerto, debe haber un proceso, una cadena circular de recursos, es decir, P0 en el conjunto de procesos {P0, P1, P2, ···, Pn} está esperando un recurso ocupado por P1; P1 está esperando el recurso ocupado por P2, ..., Pn está esperando el recurso ocupado por P0.

El siguiente código se interbloqueará


public class KillLock {
    
    
    public static void main(String[] args) {
    
    
        ManEatFood lk = new ManEatFood("李逵", 0);
        ManEatFood sj = new ManEatFood("宋江", 1);
        lk.start();
        sj.start();
    }
}

class HMilk{
    
    }//牛奶
class CBread{
    
    };//面包

class ManEatFood extends Thread{
    
    

     String man;
     int eat;

	/**
     * static修饰表示资源独一份
     */
    static HMilk hMilk = new HMilk();
    static CBread cBread = new CBread();

    ManEatFood(String man,int eat){
    
    
        this.man=man;
        this.eat=eat;
    }

    @Override
    public void run() {
    
    
        try {
    
    
            eatingFood();
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }

    public void eatingFood() throws InterruptedException {
    
    

        if (eat==0){
    
    
            synchronized (hMilk){
    
    
                System.out.println(this.man+"我渴了,准备喝牛奶!!");
                Thread.sleep(1000);
                synchronized (cBread){
    
    
                    System.out.println(this.man+"我饿了,我要吃面包!!");
                }
            }

        }else{
    
    
            synchronized (cBread){
    
    
                System.out.println(this.man+"我饿了,我要吃面包!!");
                Thread.sleep(2000);
                synchronized (hMilk){
    
    
                    System.out.println(this.man+"我渴了,准备喝牛奶!!");
                }
            }
        }


    }
}

El resultado del interbloqueo es el siguiente: esperando en un bucle infinito ...

Inserte la descripción de la imagen aquí


Solución al interbloqueo:

¡La forma más directa es destruir las cuatro condiciones de bloqueo! ! Como sigue

Solución al interbloqueo:

Romper la solicitud para mantener esta condición puede resolver el problema del interbloqueo, es decir, ¡poner otro bloqueo de sincronización afuera!

Figura del resultado después de manejar el interbloqueo:
Inserte la descripción de la imagen aquí


Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45496190/article/details/108653280
Recomendado
Clasificación