首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件接口中的signalAll与对象中的notifyAll

条件接口中的signalAll与对象中的notifyAll
EN

Stack Overflow用户
提问于 2012-05-02 04:26:42
回答 1查看 6K关注 0票数 3

昨天只有我问了这个问题,Condition vs wait notify mechanism

2)我想编辑同样的内容,并在我的问题中添加一些假设,但由于它可能变得繁琐,包含了足够多的文本,使读者感到不感兴趣和困惑,所以我想在这里提出一个新的问题。

3)考虑到我的帖子的上下文( url在第1点中给出),考虑4个线程的情况: P1、T1和P2,T2作用于单个数据结构'S‘。

4)再次尝试利用条件接口而不是等待通知的优点。

5)考虑一下守则

代码语言:javascript
复制
final Lock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
Condition c3 = lock.newCondition();
Condition c4 = lock.newCondition();

6)考虑使用P1、T1使用c1、c2 (以标准的等待()/signalAll()方式)。考虑P2、T2分别使用c3、c4 (在标准的等待()/signalAll()方式)中分别使用put、take、put1和take1方法。

7)当我执行c1.signalAll()时,将只等待/由于condition1而等待的线程接收信号。我说得通吗?

8)考虑一种等待/通知机制来实现同样的说法,

代码语言:javascript
复制
private static final Object lock= new Object();
synchronized(lock)

考虑put、take、put1、take1,因此如果任何线程在任何条件满足上执行lock.notifyAll(),甚至因为其他条件而等待/打开的线程也会收到通知。那是真的吗?这是否可以算作使用等待/通知超过条件机制的一个缺点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-30 07:04:47

是的,你是对的。Condition类是内部条件队列(通过Object.waitObject.notifyObject.notifyAll控制的队列)的推广。

我将引用Brian Goetz`s在实践中的Java并发性,第306-307页

内在条件队列有几个缺点。每个内部锁只能有一个关联的条件队列,这意味着在像BoundedBuffer这样的类中,多个线程可能会在相同的条件队列上等待不同的条件谓词,而最常见的锁定模式涉及公开条件队列对象。这两个因素使得不可能强制执行统一服务员使用notifyAll的要求。如果希望编写具有多个条件谓词的并发对象,或者希望对条件队列的可见性进行更多控制,则显式锁和条件类为内部锁和条件队列提供了更灵活的替代方案。

条件与单个锁相关联,就像条件队列与单个内部锁相关联一样;就像lock提供了比内在锁更丰富的特性集一样,条件提供了比内部条件队列更丰富的特性集:每个锁多个等待集、可中断和不中断条件等待、基于截止日期的等待以及公平或不公平排队的选择。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10407708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档