Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Design Patterns - Fatal编程技术网

Java 阻塞队列与生产者-消费者模式的经典实现

Java 阻塞队列与生产者-消费者模式的经典实现,java,multithreading,design-patterns,Java,Multithreading,Design Patterns,我知道,在实现生产者-消费者模式时,我们可以使用BlockingQueue而不是经典的wait()和notify()。我的问题是,哪种实现更有效?在一篇关于阻塞队列的文章中,有人写道:“您不需要使用wait和notify在生产者和消费者之间进行通信。” 阅读更多:“.这种简单性是否以牺牲效率为代价?”BlockingQueue只是一个放置wait()和notify()的类一般来说,自己动手只是重新发明轮子,只有当你有很多生产者和消费者,并且你可以根据你的代码以某种特定的方式进行优化时,才值得这么

我知道,在实现生产者-消费者模式时,我们可以使用
BlockingQueue
而不是经典的
wait()
notify()
。我的问题是,哪种实现更有效?在一篇关于阻塞队列的文章中,有人写道:“您不需要使用
wait
notify
在生产者和消费者之间进行通信。”


阅读更多:“.这种简单性是否以牺牲效率为代价?”

BlockingQueue只是一个放置wait()和notify()的类一般来说,自己动手只是重新发明轮子,只有当你有很多生产者和消费者,并且你可以根据你的代码以某种特定的方式进行优化时,才值得这么做。

阻塞队列会更快,因为它不使用等待/通知或同步来访问队列。所有人都同意nt包使用原子类实现无锁算法


设想一个由100个元素组成的队列,1000个线程想要完成它们的工作。对于一个同步的实现,每个元素999个线程需要等待,直到有一个线程选择了它的任务。对于一个无锁算法,100个线程同时选择它们的任务,只有其他900个线程需要等待。

如果ob的数量每秒生成/消耗的对象少于100000个,那么您将无法看到标准或您自己的实现之间的差异

否则,您可以使用以下选项来加速代码:

  • 使用ArrayBlockingQueue而不是LinkedBlockingQueue:无需为每个传输的消息创建包装器对象。ArrayBlockingQueue的另一个优点是,如果队列已满,则生产者线程将被阻塞。事实上,如果使用者速度不快,生产者应减速,否则,我们将最终导致内存耗尽

  • 成批发送消息,比如说每批发送10条消息。这减少了共享对象上线程的争用


如果你必须每秒发送数千万条消息,请看。

ya..我理解“重新发明轮子”部分。如果我只有一个生产者和一个消费者,哪一个会更快阻止队列还是经典队列?从技术上讲,是“经典队列”“这种方法创建的对象少了一个,在实现它的方式上可能会有其他细微的差别,但同样,它是可以忽略不计的,不值得额外的努力和可能出现的错误。我更担心可读性和维护。通过使用简单的数据结构,您将为未来的开发人员节省多少时间?另一方面,如果您推出自己的解决方案,他们会浪费多少时间来试图弄清楚为什么您不使用BlockingQueue?没想到:PBut 900个线程仍然在等待,对吗?。因此,必须有一种机制来通知(notify())正在等待的(wait())线程。。。在我看来,它仍然像是等待-通知组合。正确,但不是实际访问。编辑传入。这很有意义。谢谢:)我可以知道为什么是100000吗?这有区别吗?这可能是1000000,取决于混凝土机器。对于低级机器,快速同步算法的实现大约需要1 mks。因此每秒100000个事件不会引起争用。