Java 与条件变量的互斥关联

Java Mutex Association with Condition Variable

Java(wait() notify())中的每个条件变量都与单个互斥锁(同步)相关联。

有人说(在 Java 中),每个互斥量也与一个条件变量相关联,这是一个比 pthreads 的 cond 变量和互斥量效率低的实现。但是我无法理解这个。那是什么意思? Java 与 C/C++ pthreads 有何不同?

无法将多个条件变量与单个互斥量相关联是一种限制。例如,假设你想实现一个多生产者、多消费者阻塞队列(例如,java.util.concurrent.ArrayBlockingQueue)。

必须只有一个互斥量:生产者有一个互斥量而消费者有不同的互斥量是行不通的。但是使用 Java 的 synchronized 机制,这意味着也只能有一个条件变量。这意味着,使队列变为 "not-full" 的消费者必须发出与使队列变为 "not-empty" 的生产者发出的信号相同的条件。而 that 意味着,生产者和消费者必须 notifyAll(),否则无法保证被生产者唤醒的线程不会是另一个生产者,或者,一个消费者唤醒的线程不会是另一个消费者。

在基于 pthreads 的实现中,队列可以有一个互斥锁和一个供生产者等待的条件变量,以及一个供消费者等待的不同条件变量。


幸运的是,Java 标准库提供了另一种锁定方式:java.util.concurrent.locks.Lock 接口定义了一个互斥锁,可以给出任意数量的关联 Condition 对象。