常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出
很多不同类型的队列,%$ 就是其中的一种)
先进先出(&'&():先插入的队列的元素也最先出队列,类似于排队
的功能。从某种程度上来说这种队列也体现了一种公平性。
后进先出()'&():后插入队列的元素最先出队列,这种队列优先处
理最近发生的事件。
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模
型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另
外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用
队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和
消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?理想情况下,如果生产
者产出数据的速度大于消费者消费的速度,并且当生产出来的数据累积到一定程度的时候,
那么生产者必须暂停等待一下(阻塞生产者线程),以便等待消费者线程把累积的数据处
理完毕,反之亦然。然而,在 !! 包发布以前,在多线程环境下,我们每个程序员
都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不
小的复杂度。好在此时,强大的 !! 包横空出世了,而他也给我们带来了强大的
"#$。(在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦
条件满足,被挂起的线程又会自动被唤醒),下面两幅图演示了 "#$ 的两个常见
阻塞场景:
如上图所示:当队列中没有数据的情况
下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。