gpt4 book ai didi

java - ReentrantLock.lock() 不会阻塞其他线程

转载 作者:搜寻专家 更新时间:2023-11-01 01:34:42 25 4
gpt4 key购买 nike

我很难理解 ReentrantLock.lock() 的行为

我有以下类(class)

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() 的正确使用和功能有什么误解?

最佳答案

你没有误解ReentrantLock,你误解了ConditionCondition 绑定(bind)到锁上,Condition.await() 将有效地解锁、检查和等待,然后重新锁定锁。参见 Condition.await() .

a()中,lock()和调用await()之间,以及await返回之间()unlock(),您的锁的行为符合您的预期。在对 await() 的调用中,Condition 正在管理它。

这是“条件变量”一般概念的一部分;这就是为什么您找到的任何线程库都将某种锁与条件相关联(例如,在 POSIX C 中,pthread_cond_wait 需要条件变量 互斥锁)。

查看有关 condition variables 的维基百科文章, 它详细解释了这种行为及其原因。

关于java - ReentrantLock.lock() 不会阻塞其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com