【问题标题】:Java Mutex Association with Condition VariableJava Mutex 与条件变量的关联
【发布时间】:2016-01-31 17:18:06
【问题描述】:
Java 中的每个条件变量(wait() notify())都与单个互斥锁相关联(同步)。
有人说(在 Java 中),每个互斥锁还与单个条件变量相关联,这比 pthreads 的 cond 变量和互斥锁的实现效率低。但是,我无法理解这一点。这意味着什么? Java 与 C/C++ pthread 在这方面有何不同?
【问题讨论】:
标签:
java
c++
multithreading
pthreads
condition-variable
【解决方案1】:
无法将多个条件变量与单个互斥锁相关联是一种限制。例如,假设您要实现一个多生产者、多消费者的阻塞队列(例如,java.util.concurrent.ArrayBlockingQueue)。
必须只有一个互斥锁:生产者使用一个互斥锁,消费者使用不同的互斥锁是行不通的。但是使用Java 的synchronized 机制,这意味着也只能有一个条件变量。这意味着,使队列变为“未满”的消费者必须发出与使队列变为“非空”的生产者发出的相同条件的信号。 that 意味着,生产者和消费者必须notifyAll(),否则不能保证被生产者唤醒的线程不会是另一个生产者,或者不能保证被生产者唤醒的线程一个消费者不会是另一个消费者。
在基于 pthreads 的实现中,队列可以有一个互斥体和一个供生产者等待的条件变量,以及一个供消费者等待的不同条件变量。
幸运的是,Java 标准库提供了另一种锁定方式:java.util.concurrent.locks.Lock 接口定义了一个互斥体,可以发出任意数量的关联Condition 对象。