(三十二)J.U.C之collections框架:LinkedBlockingQueue

LinkedBlockingQueue是在JDK1.5时,随着JUC包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于单链表实现。

LinkedBlockingQueue是一种近似有界阻塞队列,为什么说近似?因为LinkedBlockingQueue既可以在初始构造时就指定队列的容量,也可以不指定,如果不指定,那么它的容量大小默认为Integer.MAX_VALUE

LinkedBlockingQueue除了底层数据结构(单链表)与ArrayBlockingQueue不同外,另外一个特点就是:
它维护了两把锁——takeLockputLock
takeLock用于控制出队的并发,putLock用于入队的并发。这也就意味着,同一时刻,只能只有一个线程能执行入队/出队操作,其余入队/出队线程会被阻塞;但是,入队和出队之间可以并发执行,即同一时刻,可以同时有一个线程进行入队,另一个线程进行出队,这样就可以提升吞吐量。

在ArrayBlockingQueue章节中,我们说过,ArrayBlockingQueue维护了一把全局锁,无论是出队还是入队,都共用这把锁,这就导致任一时间点只有一个线程能够执行。那么对于“生产者-消费者”模式来说,意味着生产者和消费者不能并发执行。

具体原理及使用示例请查看https://segmentfault.com/a/1190000016315487

发布了107 篇原创文章 · 获赞 1 · 访问量 5347

猜你喜欢

转载自blog.csdn.net/daziyuanazhen/article/details/104876141