ReentrantLock.lock() の動作を理解するのに苦労しています
私は次のクラスを持っています
import java.util.concurrent.locks.*;
class BlockingClass {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void a() {
lock.lock();
System.out.println("called in method a(): lock()");
try {
System.out.println("called in method a(): await()");
condition.await();
}
catch (InterruptedException e) {}
finally {
lock.unlock();
System.out.println("called in method a(): unlock() ");
}
}
public void b() {
lock.lock();
System.out.println("called in method b(): lock()");
System.out.println("called in method b(): signalAll()");
condition.signalAll();
lock.unlock();
System.out.println("called in method b(): unlock() ");
}
}
次のテストで実行します。
class BlockingClassTest {
public static void main(String[] args) throws InterruptedException {
final BlockingClass blockingClass = new BlockingClass();
new Thread() {
public void run() {
System.out.println("Thread1 calling a()");
blockingClass.a();
}
}.start();
Thread.sleep(1000);
new Thread() {
public void run() {
System.out.println("Thread2 calling b()");
blockingClass.b();
}
}.start();
}
}
私はデッドロックを予想していたでしょう。a() メソッドが lock.lock() を呼び出すと、b() メソッドを呼び出す人は、a() を呼び出すスレッドが lock.unlock() を呼び出すまで、b の lock.lock() で待機する必要があると思います。しかし、a() は b() が condition.signalAll() を呼び出すのを待っているため、両方のメソッドは永久にブロックされたままになっているはずです。
代わりに、これはコンソールに表示される出力です。
Thread1 calling a()
called in method a(): lock()
called in method a(): await()
Thread2 calling b()
called in method b(): lock()
called in method b(): signalAll()
called in method a(): unlock()
called in method b(): unlock()
lock() と unlock() の適切な使用と機能について、私は何を誤解していますか?