带条件变量的Java互斥体关联
Java中的每个条件变量(wait()notify())都与一个互斥(synchronized)关联带条件变量的Java互斥体关联,java,c++,multithreading,pthreads,condition-variable,Java,C++,Multithreading,Pthreads,Condition Variable,Java中的每个条件变量(wait()notify())都与一个互斥(synchronized)关联 我说过than(在Java中),每个互斥体还与一个条件变量相关联,这是一个比pthreads的cond变量和互斥体效率更低的实现。然而,我无法理解这一点。这是什么意思?Java与C/C++pthreads在这一点上有什么不同?无法将多个条件变量与单个互斥体关联是一个限制。例如,假设您想要实现一个多生产者、多消费者的阻塞队列(例如,java.util.concurrent.ArrayBlockin
我说过than(在Java中),每个互斥体还与一个条件变量相关联,这是一个比pthreads的cond变量和互斥体效率更低的实现。然而,我无法理解这一点。这是什么意思?Java与C/C++pthreads在这一点上有什么不同?无法将多个条件变量与单个互斥体关联是一个限制。例如,假设您想要实现一个多生产者、多消费者的阻塞队列(例如,
java.util.concurrent.ArrayBlockingQueue
)
必须只有一个互斥体:生产商只有一个互斥体,消费者只有另一个互斥体是行不通的。但是使用Java的synchronized
机制,这意味着也只能有一个条件变量。这意味着,使队列变为“未满”的使用者必须发出与使队列变为“非空”的生产者发出的信号相同的条件。这意味着,生产者和消费者必须notifyAll()
,因为否则,不能保证生产者唤醒的一个线程不会是另一个生产者,或者消费者唤醒的一个线程不会是另一个消费者
在基于pthreads的实现中,队列可以有一个互斥锁,一个条件变量供生产者等待,另一个条件变量供消费者等待
幸运的是,Java标准库提供了另一种锁定方式:
Java.util.concurrent.locks.Lock
接口定义了一个互斥体,可以给出任意数量的相关条件
对象