待機が実行されると、ロックは自動的に解放されます
- 待機がロックされている場合、待機が実行された後にロックが解放されます
- 通知がロックされている場合、通知が実行されると待機が開始されますが、スレッドはロックを解放しません
テストコードは次のとおりです。
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がロックを取得して、待機が継続するまで実行を開始します。
通知実行はロックを解放しません
- notifyの実行後に対応するスレッドをウェイクアップしますが、実行が完了するまでスレッドはロックを解放しません。
待機状態で割り込みを実行する
- スレッドが待機状態の場合、割り込みメソッドの実行時にInterruptedExceptionが発生します。
ロックを解除するためのいくつかの条件
- 同期されたコードブロックが実行されると、ロックが解除されます
- 同期されたコードブロックの実行で例外が発生し、スレッドが終了してロックが解放されます
- 同期されたコードブロックを実行する