看看ArrayBlockingQueue源码Java9

    这里能够看到实现的接口有哪些(Serializable, Iterable<E>, Collection<E>, BlockingQueue<E>, Queue<E>),相应的ArrayBlockingQueue就有哪一些特性。数组

    ArrayBlockingQueue由数组实现的有界阻塞队列。此队列命令元素FIFO(先入先出)。队列的头是队列中最长时间的元素,队列的尾部是队列中的元素最短期。在队列尾部插入新元素,队列检索操做在队列头中获取元素。this

    这是一个经典的“有界缓冲区”,其中固定大小数组保存由生产者插入并由使用者提取的元素。一旦建立,容量就没法更改。试图将元素放到一个满的队列中,会致使操做阻塞;试图从空队列中获取元素也会相似地阻塞。线程

    有如下的构造方法:3d

ArrayBlockingQueue​(int capacity):使用给定的(固定)容量和默认访问策略建立一个ArrayBlockingQueue。blog

ArrayBlockingQueue​(int capacity, boolean fair):使用给定的(固定)容量和指定的访问策略建立一个ArrayBlockingQueue。继承

    能够看到capacity须要大于0,否则会有IllegalArgumentException异常,而后初始化this.items数组,对于传入的fair,用来构建ReentrantLock,使用公平锁仍是非公平锁(sync = fair ? new FairSync() : new NonfairSync())。notEmpty与notNull获取Condition。接口

  • NonfairSync非公平锁:当锁处于无线程占有的状态,此时其余线程和在队列中等待的线程均可以抢占该锁。 
  • FairSync公平锁:当锁处于无线程占有的状态,在其余线程抢占该锁的时候,都须要先进入队列中等待。 

    ArrayBlockingQueue​(int capacity, boolean fair, Collection<? extends E> c):建立具备给定(固定)容量的ArrayBlockingQueue,指定的访问策略并最初包含给定集合的元素,以集合的迭代器的遍历顺序添加。队列

    先是调用上一个构造方法,而后使用lock加锁,而后进行遍历添加,在finally里面解锁。ci

    add​(E e):在不超出队列容量的状况下当即执行此操做,则将指定元素插入此队列的尾部,成功时返回true,若是此队列已满,则抛出IllegalStateException。rem

    这里使用的是继承的add方法,实现了offer方法。

    后者的方法加了超时的时间控制,利用Condition的awaitNanos方法。

    put(E e):将指定元素插入此队列的尾部,等待队列已满时空间可用。这里使用了notFull.await()阻塞写数据,在enqueue里面notEmpty.signal(),唤醒读数据。

    poll方法:检索并删除此队列的头部,若是此队列为空,则返回null,这里调用的是dequeue(),里面有notFull.signal();相应的也有poll(long timeout, TimeUnit unit)方法。

    take():检索并删除此队列的头部,必要时等待,直到元素可用。

    peek():检索但不移除此队列的头部,若是此队列为空,则返回null。

    remove(Object o):今后队列中删除指定元素的单个实例(若是存在)。

有什么讨论的内容,能够加我公众号:

相关文章
相关标签/搜索