El bloqueo se libera automáticamente después de ejecutar la espera, y el bloqueo no se libera cuando se ejecuta la notificación

El bloqueo se libera automáticamente después de ejecutar la espera

  1. Cuando la espera está en el bloqueo, el bloqueo se liberará después de que se ejecute la espera.
  2. Cuando la notificación está en el bloqueo, la espera se despierta cuando se ejecuta la notificación, pero el subproceso no libera el bloqueo.

El código de prueba es el siguiente:

package com.chapter03;

class Service02 {
    
    
    public void testMethod(Object lock) {
    
    
        try {
    
    
            synchronized (lock) {
    
    
                System.out.println("begin wait");
                lock.wait();
                System.out.println("end wait");
            }
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }

}

class ThreadA extends Thread {
    
    
    private Object lock;

    public ThreadA(Object lock) {
    
    
        this.lock = lock;
    }

    @Override
    public void run() {
    
    
        Service02 service02 = new Service02();
        service02.testMethod(lock);
    }
}

class ThreadB extends Thread {
    
    
    private Object lock;

    public ThreadB(Object lock) {
    
    
        this.lock = lock;
    }

    @Override
    public void run() {
    
    
        Service02 service02 = new Service02();
        service02.testMethod(lock);
    }
}

public class StudyThreads02释放锁与不释放锁 {
    
    
    public static void main(String[] args) {
    
    
        Object lock = new Object();
        ThreadA threadA = new ThreadA(lock);
        ThreadB threadB = new ThreadB(lock);
        threadA.start();
        threadB.start();
    }
}

Resultado de la ejecución: el bloqueo se libera después de que se ejecuta la espera, y el subproceso B obtiene el bloqueo y comienza a ejecutarse hasta que la espera continúa esperando.

inserte la descripción de la imagen aquí

notificación de ejecución no libera el bloqueo

  1. Activa el subproceso correspondiente después de ejecutar la notificación, pero el subproceso no liberará el bloqueo hasta que se complete la ejecución.

Ejecutar interrupción en estado de espera

  1. Cuando el subproceso está en estado de espera, se producirá una InterruptedException cuando se ejecute el método de interrupción.

Varias condiciones para liberar el bloqueo.

  1. Cuando se ejecuta el bloque de código sincronizado, se libera el bloqueo
  2. La ejecución del bloque de código sincronizado encuentra una excepción, lo que hace que el subproceso finalice y libere el bloqueo.
  3. Ejecutar un bloque de código sincronizado

Supongo que te gusta

Origin blog.csdn.net/weixin_43960044/article/details/121053662
Recomendado
Clasificación