条件是否为每个对象提供多个等待集?

Thi*_*ker 1 java multithreading conditional-statements reentrantlock

我正在阅读有关条件的信息java.util.concurrent.locks.Condition.

条件因素将对象监视器方法(wait,notify和notifyAll)>分解为不同的对象,以通过将它们与使用任意的Lock实现相结合来实现每个对象具有多个等待集的效果.

有人可以解释一下吗?

这比普通同步块或方法有什么好处?

Mar*_*Łoś 12

一个锁可以与许多条件相关联.Lock是一个"对象",每个条件都是"等待集".这允许共享关键部分的独立条件.例如,考虑有限的生产者 - 消费者问题.解决这个问题的一种方法是使用一个保护队列的锁,以及两个独立的等待集:一个用于生产者,等待插槽将项放入队列,另一个用于等待物品采取的消费者.使用普通的旧API synchronizedwait/notifyAPI,我们可以做的最好的就是这样:

这样做的缺点是,在队列的每次更改都会唤醒生产者和消费者,即使它不可能允许给定的线程继续进行(例如,当其他一些消费者从队列中获取项目时,消费者会被唤醒).使用Lock/Condition API,我们可以实现将等待的消费者和生产者分开的解决方案,从而减少冗余唤醒和检查:

Lock lock = new ReentrantLock();
Condition hasPlace = lock.newCondition();
Condition hasItems = lock.newCondition();
Run Code Online (Sandbox Code Playgroud)

这样,消费者等待生产者生成一些项目(hasItems条件),并且在从队列中移除项目时,它通知生产者存在空槽(hasPlace条件).这两个条件都与相同的关键部分(Lock)相关联,因此我们保持通常的排除和释放锁定等待保证,同时获得分离等待队列的能力.