链阻塞队列 LinkedBlockingQueue

来源:互联网 发布:centos 中文文档 编辑:程序博客网 时间:2024/05/16 07:12

1.本文目录

  • 本文目录
  • 开篇明志
  • 分析
    • 构造方法及初始化
  • 阅读文献

2.开篇明志

LinkedBlockingQueue 类实现了 BlockingQueue 接口。本文来说说这个基于链表的阻塞队列。

3.分析

LinkedBlockingQueue是大小不定的BlockingQueue,可以指定容量,也可以不指定, 默认一个类似无限大小的容量Integer.MAX_VALUE。

LinkedBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所 有元素之中是放入时间最久的那个,而尾元素则是最短的那个。

LinkedBlockingQueue是一个基于链表的阻塞队列,内部位置一个数据缓冲队列(该队列由一个链表构成)。当生产者将数据放入到队列中时候,队列会从生产者手中获取数据, 并缓存在队列内部, 而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列, 直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列并发性能。

如果构造一个LinkedBlockingQueue对象,而没有指定其容量大小,LinkedBlockingQueue会默认一个类似无限大小的容量(Integer.MAX_VALUE), 这样的话,如果生产者的速度一旦大于消费者的速度,也许还没有等到队列满阻塞产生,系统内存就已经被消耗殆尽了。

LinkedBlockingQueue 和 ArrayBlockingQueue 比较起来,他们背后的所用数据结构不一样, 导致LinkedBlockingQueue 的数据吞吐量要大于 ArrayBlockingQueue , 但在线程数量很大时性能的可预见性低于 ArrayBlockingQueue.

这里写图片描述

构造方法及初始化

构造方法

  • LinkedBlockingQueue()
    Creates a LinkedBlockingQueue with a capacity of Integer.MAX_VALUE.
  • LinkedBlockingQueue(Collection<? extends E> c)
    Creates a LinkedBlockingQueue with a capacity of Integer.MAX_VALUE, initially containing the elements of the given collection, added in traversal order of the collection’s iterator.
  • LinkedBlockingQueue(int capacity)
    Creates a LinkedBlockingQueue with the given (fixed) capacity.

初始化LinkedBlockingQueue实例

BlockingQueue<String> unbounded = new LinkedBlockingQueue<String>();BlockingQueue<String> bounded   = new LinkedBlockingQueue<String>(1024);bounded.put("Value");String value = bounded.take();

阅读文献

http://tutorials.jenkov.com/java-util-concurrent/linkedblockingqueue.html