1

我正在使用 aReentrantLock和 aCondition来同步两个线程。每当消费者线程await()在生产者线程执行 a 之前执行 a on 条件时signal(),事情似乎工作正常。但是,当生产者线程signal()在消费者线程执行 a 之前执行 a 时await(),则消费者线程最终将永远等待。这是应该发生的还是我做错了什么?当发出条件信号并且没有等待线程时,预期的行为是什么?

这是消费者的代码:

this.lock.lock();
Log.d("websocket", "Sender acquired lock");
try
{
    Log.d("websocket", "Sender waiting for message from server");
    this.resultReady.await();
    Log.d("websocket", "Sender waking up");
    return this.result;

} catch (InterruptedException e)
{
    e.printStackTrace();
}
finally {
    this.lock.unlock();
}

这是生产者的代码:

Log.d("websocket", "Receiver acquiring lock");
this.lock.lock();
Log.d("websocket", "Receiver acquired lock");
try
{
    Log.d("websocket", "Receiver setting result");
    result = serviceResult;
    Log.d("websocket", "Receiver waking up waiting threads");
    this.resultReady.signal();
} finally
{
    this.lock.unlock();
}
4

1 回答 1

3

这是应该发生的还是我做错了什么?当发出条件信号并且没有等待线程时,预期的行为是什么?

这应该会发生。如果没有线程等待,则没有效果。Java 文档说:

唤醒一个等待线程。

如果有任何线程在此条件下等待,则选择一个用于唤醒。然后,该线程必须在从等待返回之前重新获取锁。

当然,如果没有线程可以唤醒,那么就没有效果吗?

您有一个缓冲区,其中包含一个项目,您的result. 您必须独立于方法测试此结果是否有效await()。或者切换到类似 a 的东西Semaphore,它确实具有您可以设置的内部状态。

// Consumer
this.lock.lock();
Log.d("websocket", "Sender acquired lock");
try
{
    Log.d("websocket", "Sender waiting for message from server");
    while( result == null )   // CHANGE HERE
        resultReady.await();
    Log.d("websocket", "Sender waking up");
    return this.result;

} catch (InterruptedException e)
{
    e.printStackTrace();
}
finally {
    this.lock.unlock();
}
于 2014-08-09T16:16:00.637 回答