java同步中条件变量和条件谓词之间的区别

时间:2014-08-07 18:56:44

标签: java concurrency synchronization

我正在寻找一个解释的例子来理解java中条件变量和条件谓词之间的区别。

这是在同步的背景下。

另外我想知道这些术语是否是java文档中的实际java术语或其他作者引用这些术语?

为了进一步澄清这个问题,请考虑这个例子(取自Java Concurrency一书):

@ThreadSafe
public class BoundedBuffer<V> extends BaseBoundedBuffer<V> {

    public BoundedBuffer(int size) { super(size); }

    // BLOCKS-UNTIL: not-full
    public  synchronized  void put(V v) throws InterruptedException {
        while (isFull())
            wait();
        doPut(v);
        notifyAll();
    }

    // BLOCKS-UNTIL: not-empty
    public  synchronized  V take() throws InterruptedException {
        while (isEmpty())
            wait();
        V v = doTake();
        notifyAll();
        return v;
    } 
}

什么是条件变量,什么是条件谓词?您可能有一个比这更好,更简单的例子来解释差异。我很困惑,因为每个人指的是什么(条件变量vs谓词),它们是否是相同的。

有人理解低级别的java并发性可能是回答这个问题的最佳方法。

3 个答案:

答案 0 :(得分:3)

条件变量是由OS或线程系统提供的构造,它提供等待通知操作并维护一组等待线程。

条件谓词是由使用条件变量的代码调用或实现的谓词(布尔值函数或表达式)。简而言之,线程在条件变量上等待,直到谓词为真,并且当谓词变为真时,线程通知(或发出信号)条件变量。

换句话说,条件谓词是被评估的代码,用于测试对象的逻辑状态,而条件变量是在更改对象状态的线程之间进行通信的机制。等待对象改变状态。

示例代码有点混乱,因为它使用具有相同条件变量的两个条件谓词。执行 put 的线程测试isFull谓词(它不必是函数;它可以是布尔表达式)和执行的线程< / em>测试isEmpty谓词。它们都使用相同的条件变量,即缓冲区对象this。请注意,while循环中测试的条件是谓词的倒数。执行 put 操作的线程等待直到谓词为真,因此代码等待谓词不为真。

术语条件谓词似乎没有标准化。它是一个合理描述性的术语,Goetz在 Java Concurrency in Practice 中使用它。在Lampson和Redell,使用Mesa中的进程和监视器的经验,他们大多只使用术语谓词。 (Java的对象监视器几乎是Mesa的精确副本.Pthreads也非常相似。)我也看到过术语 precondition 州谓词使用。

术语条件变量是该构造的相当标准的术语。它由Mesa和Pthreads使用,可能追溯到Hoare与监视器的原创作品。奇怪的是,Java规范并没有非常使用这个术语;它们只是引用与每个对象关联的监视器,并且可以锁定,解锁,等待或通知它。然而,Condition包中有java.util.concurrent.locks接口和实现。 Condition接口表示条件变量。

答案 1 :(得分:0)

条件变量它是一个验证一个条件的布尔值(可以是等待另一个任务/线程的标志)。

条件谓词是lambda表达式,你可以在这里阅读更多相关内容:

http://howtodoinjava.com/2014/04/04/how-to-use-predicate-in-java-8/

答案 2 :(得分:0)

条件变量 - http://baptiste-wicht.com/posts/2010/09/java-concurrency-part-5-monitors-locks-and-conditions.html: 条件变量是一种在相同条件下等待的进程队列

条件谓词 - really long link: 条件谓词是使操作状态依赖于第一位的前提条件

我的解释:条件变量是一个等待共同条件谓词的进程队列(可能是也可能没有错误 - 再次,我的解释)。