我很难理解 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() 方法的人都必须在 b 的 lock.lock() 处等待,直到调用 a() 的线程调用 lock.unlock()。但是由于 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() 的正确使用和功能有什么误解?