El bloqueo se libera automáticamente después de ejecutar la espera
- Cuando la espera está en el bloqueo, el bloqueo se liberará después de que se ejecute la espera.
- 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.
notificación de ejecución no libera el bloqueo
- 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
- 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.
- Cuando se ejecuta el bloque de código sincronizado, se libera el bloqueo
- La ejecución del bloque de código sincronizado encuentra una excepción, lo que hace que el subproceso finalice y libere el bloqueo.
- Ejecutar un bloque de código sincronizado