我正在寻找一个解释的例子来理解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谓词.它们都使用相同的条件变量,即与此相关的缓冲区对象.请注意,while循环中测试的条件是谓词的倒数.执行put操作的线程一直等到谓词为真,因此代码在谓词不为真时等待.
条件谓词一词似乎没有标准化.这是一个相当具有描述性的术语,Goetz在Java Concurrency in Practice中使用它.在Lampson和Redell,Mesa中的过程和监视器的经验中,他们大多只使用术语谓词. (Java的对象监视器几乎是Mesa的精确副本.Pthreads’也非常相似.)我也看到了术语precondition或状态谓词.
术语条件变量是该构造的相当标准的术语.它被Mesa和Pthreads使用,可能追溯到Hoare与显示器的原始工作.奇怪的是,Java规范并没有非常使用这个术语;它们只是引用与每个对象关联的监视器,并且可以锁定,解锁,等待或通知它.但是java.util.concurrent.locks包中有一个Condition接口和实现. Condition接口表示条件变量.