Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带条件变量的Java互斥体关联_Java_C++_Multithreading_Pthreads_Condition Variable - Fatal编程技术网

带条件变量的Java互斥体关联

带条件变量的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

Java中的每个条件变量(wait()notify())都与一个互斥(synchronized)关联


我说过than(在Java中),每个互斥体还与一个条件变量相关联,这是一个比pthreads的cond变量和互斥体效率更低的实现。然而,我无法理解这一点。这是什么意思?Java与C/C++pthreads在这一点上有什么不同?

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

必须只有一个互斥体:生产商只有一个互斥体,消费者只有另一个互斥体是行不通的。但是使用Java的
synchronized
机制,这意味着也只能有一个条件变量。这意味着,使队列变为“未满”的使用者必须发出与使队列变为“非空”的生产者发出的信号相同的条件。这意味着,生产者和消费者必须
notifyAll()
,因为否则,不能保证生产者唤醒的一个线程不会是另一个生产者,或者消费者唤醒的一个线程不会是另一个消费者

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


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