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

阿帕达纳

我正在寻找一个带有解释的示例,以了解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并发级别低的人可能是回答此问题的最佳人选。

斯图尔特·马克斯

条件变量是由提供的OS或线程系统中提供的构建体的等待通知操作和维护一组等待线程。

条件谓词是称为或由使用条件变量代码实现谓词(一个布尔值功能或表达)。简要地说,线程等待条件变量直到谓词为真,并且当谓词变为真时,线程通知(或发出信号)条件变量。

换句话说,条件谓词是经过评估以测试关于对象逻辑状态的某些事物的代码,而条件变量是一种机制,用于在正在更改对象的状态并且正在等待对象更改状态的线程之间进行通信。 。

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

条件谓词一词似乎没有标准化。这是一个合理的描述性术语,Goetz在Java Concurrency in Practice中使用了它在兰普森(Lampson)和雷德尔(Redell)的《梅萨(Mesa)中的流程和监视器经验》中,他们大多只使用谓词一词(Java的对象监视器几乎是Mesa的精确副本。Pthreads也非常相似。)我也看到过使用的前提条件状态谓词

术语条件变量是该构造的相当标准的技术术语。它由Mesa和Pthreads使用,可能可以追溯到Hoare最初使用监视器的工作。奇怪的是,Java规范并不经常使用该术语。它们只是引用与每个对象关联的监视器,并且可以对其进行锁定,解锁,等待或通知。但是Conditionjava.util.concurrent.locks程序包中有一个接口和实现Condition接口表示条件变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

谓词LINQ中的条件检查

来自分类Dev

条件运算符和if-else之间的区别:

来自分类Dev

if,else条件之间的变量

来自分类Dev

条件和变量!= other之间的区别Javascript / Jquery中的变量?

来自分类Dev

Java中this.variable和变量之间的区别

来自分类Dev

Java中的throw和throws之间的区别?

来自分类Dev

内联if条件和Ruby条件块之间的区别

来自分类Dev

XACML-AND条件和两个规则之间的区别

来自分类Dev

.net 4.5中异步和同步之间的区别

来自分类Dev

存在和条件之间的区别

来自分类Dev

java中的printf和println之间的区别?

来自分类Dev

前置条件,后置条件和不变约束之间有什么区别?

来自分类Dev

Mysql数据库中SELECT语句的WHERE条件的AND和OR之间的区别?

来自分类Dev

实体框架查询中&&和where条件之间的区别

来自分类Dev

java中的常量变量和最终变量之间有什么区别?

来自分类Dev

最近的iOS中同步和异步之间的区别

来自分类Dev

同步方法和同步块之间的区别

来自分类Dev

Java中InputStream和InputStreamReader之间的区别

来自分类Dev

Java和C中的数组之间的区别

来自分类Dev

是什么谓词和Java8的功能界面之间的区别?

来自分类Dev

“需要”和“何时”附带条件之间的区别

来自分类Dev

在条件变量中使用谓词的正确方法

来自分类Dev

Java中a + = b和a = a + b之间的区别

来自分类Dev

Java扩展和实例变量之间的区别

来自分类Dev

Mysql数据库中SELECT语句的WHERE条件的AND和OR之间的区别?

来自分类Dev

Java中+ =和++之间的区别

来自分类Dev

Java和C中的数组之间的区别

来自分类Dev

PowerShell中的条件标签和变量

来自分类Dev

Java中File和DocumentFile之间的区别

Related 相关文章

热门标签

归档