1)昨天我只问了这个问题Condition vs wait notify mechanism
2)我想编辑相同内容并在我的问题中添加一些ifs,但因为它可能变得很麻烦并且包含足够的文本以使读者感到不感兴趣并且让读者困惑,我想在这里提出一个新问题。
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(采用标准的await()/ signalAll()方式)。考虑P2,T2使用c3,c4(采用标准的await()/ 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(),那么由于其他条件而等待/ on的线程也会收到通知。真的吗 ?。这是否可以被视为使用条件机制的等待/通知的缺点?
答案 0 :(得分:4)
是的,你是对的。 Condition
类是内在条件队列的概括(通过Object.wait
,Object.notify
和Object.notifyAll
控制的队列。
我将引用Brian Goetz的Java Concurrency in Practice [p.306-307]
内在条件队列有几个缺点。每个内部锁只能有一个关联的条件队列,这意味着在像BoundedBuffer这样的类中,多个线程可能在相同的条件队列上等待不同的条件谓词,而最常见的锁定模式涉及暴露条件队列对象。这两个因素都无法强制执行使用notifyAll的统一服务员要求。如果要编写具有多个条件谓词的并发对象,或者希望对条件队列的可见性进行更多控制,则显式锁定和条件类提供了对内部锁定和条件队列的更灵活的替代。
条件与单个锁相关联,就像条件队列与单个内部锁相关联一样; [...]正如Lock提供了比内部锁定更丰富的功能集,Condition提供了比内部条件队列更丰富的功能集:每个锁多个等待集,可中断和不间断条件等待,基于截止时间的等待,以及选择公平或不公平的排队。