待機が実行されるとロックは自動的に解放され、通知が実行されてもロックは解放されません。

待機が実行されると、ロックは自動的に解放されます

  1. 待機がロックされている場合、待機が実行された後にロックが解放されます
  2. 通知がロックされている場合、通知が実行されると待機が開始されますが、スレッドはロックを解放しません

テストコードは次のとおりです。

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();
    }
}

実行結果:待機が実行されるとロックが解除され、スレッドBがロックを取得して、待機が継続するまで実行を開始します。

ここに画像の説明を挿入

通知実行はロックを解放しません

  1. notifyの実行後に対応するスレッドをウェイクアップしますが、実行が完了するまでスレッドはロックを解放しません。

待機状態で割り込みを実行する

  1. スレッドが待機状態の場合、割り込みメソッドの実行時にInterruptedExceptionが発生します。

ロックを解除するためのいくつかの条件

  1. 同期されたコードブロックが実行されると、ロックが解除されます
  2. 同期されたコードブロックの実行で例外が発生し、スレッドが終了してロックが解放されます
  3. 同期されたコードブロックを実行する

おすすめ

転載: blog.csdn.net/weixin_43960044/article/details/121053662