java同步中条件变量与条件谓词的区别



我正在寻找一个解释的例子,以了解java中条件变量和条件谓词之间的差异。

这是在同步上下文中。

我还想知道这些术语是在java文档中找到的实际java术语还是其他作者引用的这些术语?

为了进一步澄清这个问题,考虑以下示例(取自Java并发性书):

@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低级并发的人可能是回答这个问题的最佳人选。

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

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

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

示例代码有点令人困惑,因为它使用了两个条件谓词和相同的条件变量。一个线程做一个put测试isFull谓词(它不一定是一个函数;它可以是一个布尔表达式),并且执行take的线程测试isEmpty谓词。它们都使用相同的条件变量,即与缓冲区对象this相关联的条件变量。注意,while循环中测试的条件与谓词相反。执行put操作的线程等待直到谓词为真,因此代码在谓词不为真时等待

术语条件谓词似乎没有标准化。这是一个合理的描述性术语,Goetz在Java Concurrency in Practice中使用了它。在Lampson和Redell Mesa中的进程和监视器经验中,他们大多只是使用术语谓词。(Java的对象监视器几乎是Mesa的一模一样的复制品。Pthreads也非常相似。)我也见过使用先决条件状态谓词

术语条件变量是这个结构的一个相当标准的术语。它被Mesa和Pthreads使用,可能可以追溯到Hoare最初的显示器工作。奇怪的是,Java规范并不经常使用这个术语;它们只是指与每个对象相关联的监视器,可以锁定、解锁、等待或通知该监视器。然而,在java.util.concurrent.locks包中有一个Condition接口和实现。Condition接口代表一个条件变量。

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

条件谓词是lambda表达式,您可以在这里阅读更多信息:

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

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

条件谓词-真的很长链接:条件谓词是使操作状态首先依赖于

的先决条件。

我的解释:条件变量是等待公共条件谓词的进程队列(这可能是错误的,也可能不是错误的-再次,我的解释)。

最新更新