昨天只有我问了这个问题,Condition vs wait notify mechanism
2)我想编辑同样的内容,并在我的问题中添加一些假设,但由于它可能变得繁琐,包含了足够多的文本,使读者感到不感兴趣和困惑,所以我想在这里提出一个新的问题。
3)考虑到我的帖子的上下文( url在第1点中给出),考虑4个线程的情况: P1、T1和P2,T2作用于单个数据结构'S‘。
4)再次尝试利用条件接口而不是等待通知的优点。
5)考虑一下守则
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)考虑一种等待/通知机制来实现同样的说法,
private static final Object lock= new Object();
synchronized(lock)考虑put、take、put1、take1,因此如果任何线程在任何条件满足上执行lock.notifyAll(),甚至因为其他条件而等待/打开的线程也会收到通知。那是真的吗?这是否可以算作使用等待/通知超过条件机制的一个缺点?
发布于 2012-06-30 07:04:47
是的,你是对的。Condition类是内部条件队列(通过Object.wait、Object.notify和Object.notifyAll控制的队列)的推广。
我将引用Brian Goetz`s在实践中的Java并发性,第306-307页
内在条件队列有几个缺点。每个内部锁只能有一个关联的条件队列,这意味着在像BoundedBuffer这样的类中,多个线程可能会在相同的条件队列上等待不同的条件谓词,而最常见的锁定模式涉及公开条件队列对象。这两个因素使得不可能强制执行统一服务员使用notifyAll的要求。如果希望编写具有多个条件谓词的并发对象,或者希望对条件队列的可见性进行更多控制,则显式锁和条件类为内部锁和条件队列提供了更灵活的替代方案。
条件与单个锁相关联,就像条件队列与单个内部锁相关联一样;就像lock提供了比内在锁更丰富的特性集一样,条件提供了比内部条件队列更丰富的特性集:每个锁多个等待集、可中断和不中断条件等待、基于截止日期的等待以及公平或不公平排队的选择。
https://stackoverflow.com/questions/10407708
复制相似问题