Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java同步中条件变量和条件谓词的区别_Java_Concurrency_Synchronization - Fatal编程技术网

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

java同步中条件变量和条件谓词的区别,java,concurrency,synchronization,Java,Concurrency,Synchronization,我正在寻找一个例子来解释java中条件变量和条件谓词之间的区别 这是在同步的上下文中进行的 我还想知道这些术语是否是java文档中的实际java术语,或者其他作者是否引用了这些术语 进一步阐明这个问题,考虑这个例子(从java并发手册中获取): @ThreadSafe 公共类BoundedBuffer扩展了BaseBundedBuffer{ 公共边界缓冲区(整数大小){super(大小);} //截止日期:未满 公共同步的void put(V)抛出InterruptedException{ wh

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

这是在同步的上下文中进行的


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

进一步阐明这个问题,考虑这个例子(从java并发手册中获取):

@ThreadSafe
公共类BoundedBuffer扩展了BaseBundedBuffer{
公共边界缓冲区(整数大小){super(大小);}
//截止日期:未满
公共同步的void put(V)抛出InterruptedException{
while(isFull())
等待();
doPut(v);
notifyAll();
}
//块-直到:不为空
public synchronized V take()引发InterruptedException{
while(isEmpty())
等待();
V=doTake();
notifyAll();
返回v;
} 
}
什么是条件变量,什么是条件谓词?你可以用一个更好更简单的例子来解释这一区别。我搞不清楚每个变量到底指的是什么(条件变量vs谓词),它们是否是同一件事


了解java并发性低级别的人可能是回答这个问题的最佳人选

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

条件谓词是lambda表达式,您可以在此处了解更多信息:

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

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

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

示例代码有些混乱,因为它使用了两个具有相同条件变量的条件谓词。执行put的线程测试
isFull
谓词(它不必是函数;它可以是布尔表达式),执行take的线程测试
isEmpty
谓词。它们都使用相同的条件变量,即与缓冲区对象
this
关联的条件变量。请注意,while循环中测试的条件与谓词相反。执行put操作的线程等待谓词为true,因此代码在谓词为非true时等待

术语条件谓词似乎没有标准化。这是一个合理的描述性术语,Goetz在Java并发实践中使用了它。在Lampson和Redell中,他们在Mesa中使用进程和监视器时,大多只使用谓词一词。(Java的对象监视器几乎与Mesa的完全相同。Pthreads也非常类似。)我还看到了使用的条件或状态谓词

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

条件变量-: 条件变量是在相同条件下等待的进程队列

条件谓词-: 条件谓词是使操作状态首先依赖的前提条件


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

当然,最后一个问题可以通过查看Java文档来回答吗?“我想知道这些术语是java文档中的实际java术语,还是其他作者引用了这些术语?“我想知道,如果你甚至不知道这些条款是从哪里来的,你为什么要问这些条款的问题?你从哪里弄来的?如果没有上下文,您的问题是完全无法回答的。@EJP:这些是我在过去几年处理java并发时听到的术语。我第一次在youtube上发布的伯克利讲座视频中听到他们。后来我收到了很多人的来信,每次都吸引了我更多的注意力。我不确定这些术语是否特定于java、特定于并发模式或其他什么。上次我听说是在一个面试问题上。因此,我假设一定有地方解释了这种条件并发模式。这个问题涉及到POSIX及其工程师。作为一名年轻的se候选人,我可以看到我正在正确而彻底地奠定基础。ELHAMDULILLAH说得很好。谢谢。很好的解释,谓词的意思很简单。
@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;
    } 
}