我正在寻找一个带有解释的示例,以了解 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;
}
}
什么是条件变量,什么是条件谓词?您可能有比这更好、更简单的示例来解释差异。我很困惑每个人到底指的是什么(条件变量与谓词),无论它们是否相同。
了解java并发低级的人可能是回答这个问题的最佳人选。
最佳答案
条件变量 是由操作系统或线程系统提供的构造,它提供等待 和通知 操作并维护一组等待线程。
条件谓词 是由使用条件变量的代码调用或实现的谓词( boolean 值函数或表达式)。简而言之,线程等待条件变量直到谓词为真,并且线程在谓词为真时通知(或发信号)条件变量。
换句话说,条件谓词是被评估以测试对象逻辑状态的代码,而条件变量是一种在正在更改对象状态和等待对象的线程之间进行通信的机制改变状态。
示例代码有些困惑,因为它使用两个条件谓词和相同的条件变量。执行 put 的线程测试 isFull
谓词(它不一定是函数;它可以是 boolean 表达式)和执行 take 的线程 测试 isEmpty
谓词。它们都使用相同的条件变量,即与缓冲区对象 this
相关联的条件变量。请注意,在 while 循环中测试的条件是谓词的逆。执行put 操作的线程会一直等待直到谓词为真,因此代码会等待谓词不为真。
术语条件谓词 似乎没有标准化。这是一个合理的描述性术语,Goetz 在 Java 并发实践 中使用了它。在 Lampson 和 Redell 的Experience with Processes and Monitors in Mesa中,他们大多只使用术语predicate。 (Java 的对象监视器几乎是 Mesa 的精确副本。Pthreads 也非常相似。)我还看到了术语precondition 或 state predicate 的使用。
术语条件变量 是该构造的相当标准的技术术语。它被 Mesa 和 Pthreads 使用,可能可以追溯到 Hoare 最初使用监视器的工作。奇怪的是,Java 规范很少使用这个术语;它们只是指与每个对象关联的监视器,它可以被锁定、解锁、等待或通知。然而,java.util.concurrent.locks
包中有一个Condition
接口(interface)和实现。 Condition
接口(interface)表示一个条件变量。
关于java - java同步中条件变量和条件谓词的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190073/