看看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):今後隊列中刪除指定元素的單個實例(若是存在)。

有什麼討論的內容,能夠加我公衆號:

相關文章
相關標籤/搜索