如果Java中的当前线程多次调用condition.await()会发生什么

如果Java中的当前线程多次调用condition.await()会发生什么,java,locking,mutex,race-condition,reentrantlock,Java,Locking,Mutex,Race Condition,Reentrantlock,我想了解当我们执行下面的代码片段时到底发生了什么 当一个线程执行someMethod()并点击while循环时,如果它一次又一次地调用wait方法会发生什么? 条件/ReentrantLock如何存储/维护线程上下文 此外,一旦线程调用await(),这意味着它将释放当前锁并进入等待状态。这是否意味着另一个线程可以获取锁?如果是这样,围绕await()方法编写while循环有什么用 Lock Lock=new ReentrantLock(); Condition Condition=lock.n

我想了解当我们执行下面的代码片段时到底发生了什么

当一个线程执行someMethod()并点击while循环时,如果它一次又一次地调用wait方法会发生什么? 条件/ReentrantLock如何存储/维护线程上下文

此外,一旦线程调用await(),这意味着它将释放当前锁并进入等待状态。这是否意味着另一个线程可以获取锁?如果是这样,围绕await()方法编写while循环有什么用

Lock Lock=new ReentrantLock();
Condition Condition=lock.newCondition();
...
...
公共方法(){
lock.lock();
试一试{
对于(int i=2;i

如果我的理解有误,请纠正我。提前感谢。

等待循环的要点显然是等待状态为2。从等待电话中醒来只意味着你已经醒了。这并不意味着状态是2

逻辑跟我在半夜里等着看钟,决定回去睡觉。p> 请明确注意,可能会发生虚假唤醒。这意味着任何不检查实际所需状态的Condition.await的使用几乎肯定都有一个bug

同时,这个代码似乎有缺陷。你知道当线程在
wait
中等待时,你不会执行
signalAll
调用,对吗?因为线程正在
wait
中等待。需要有一些其他线程,执行不同的代码,可以发出条件信号,从而使该线程摆脱等待


你的问题:

我想了解当我们执行以下操作时,会发生什么 代码片段

显示代码后,线程将永远处于
等待
调用中,因为没有显示可以唤醒它的代码

(根据文档,存在虚假唤醒的可能性,如果发生这种情况,while循环会将线程重新放入等待,因为等待的内容不会改变。)

关于“一次又一次的呼叫等待”——好吧,你不能在等待的时候呼叫等待——因为在你不跑步的时候你没有地方呼叫任何东西。因此,第一次调用和后续调用之间没有区别。在每种情况下,调用线程都进入睡眠状态,直到随后发出条件信号


关于锁定-在等待时释放锁定,并在唤醒时重新获取。这是现实的需要,;在您的示例中,锁可能是在保护对“状态”的访问,任何想要修改状态并唤醒服务员的代码最好在锁的保护下进行操作。

感谢您的详细解释。如果您能帮助我了解处于等待状态的线程是如何维护的,以及ReentrantLock和Condition之间的区别,我将不胜感激。“如何”取决于特定的Java实现,但在一般操作系统中,通常有一个可运行线程队列,每个可等待资源都有一个等待线程队列。对于ReentrantLock版本条件部分,我建议写另一个问题。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
...
...
    public void someMethod() {
        lock.lock();
        try {
            for (int i = 2; i < n; i = i + 2) {
                while (state != 2) {
                    condition.await();
                }
                printNumber.accept(i);
                r.run();
                state = 0;
                condition.signalAll();
            }
        } finally {
            lock.unlock();
        }
    }