java阻塞隊列

JDK7提供了7個阻塞隊列。分別是
  • ArrayBlockingQueue :一個由數組結構組成的有界阻塞隊列。
  • LinkedBlockingQueue :一個由鏈表結構組成的有界阻塞隊列。
  • PriorityBlockingQueue :一個支持優先級排序的無界阻塞隊列。
  • DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。
  • SynchronousQueue:一個不存儲元素的阻塞隊列。
  • LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
  • LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。
常用方法:
   add        增加一個元索 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常
  remove   移除並返回隊列頭部的元素    如果隊列爲空,則拋出一個NoSuchElementException異常
  element  返回隊列頭部的元素             如果隊列爲空,則拋出一個NoSuchElementException異常
  offer       添加一個元素並返回true       如果隊列已滿,則返回false
  poll         移除並返問隊列頭部的元素    如果隊列爲空,則返回null
  peek       返回隊列頭部的元素             如果隊列爲空,則返回null
  put         添加一個元素                      如果隊列滿,則阻塞
  take        移除並返回隊列頭部的元素     如果隊列爲空,則阻塞
ArrayBlockingQueue和LinkedBlockingQueue的區別和使用場景
相同點:
  • LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的隊列
  • 內部都是使用ReentrantLock和Condition來保證生產和消費的同步;
  • 當隊列爲空,消費者線程被阻塞;當隊列裝滿,生產者線程被阻塞;
鎖機制不同:
  • LinkedBlockingQueue中的鎖是分離的,生產者的鎖PutLock,消費者的鎖takeLock
  • 而ArrayBlockingQueue生產者和消費者使用的是同一把鎖;
底層實現機制不同:
  • LinkedBlockingQueue內部維護的是一個鏈表結構,在生產和消費的時候,需要創建Node對象進行插入或移除,大批量數據的系統中,其對於GC的壓力會比較大
  • ArrayBlockingQueue內部維護了一個數組,在生產和消費的時候,是直接將枚舉對象插入或移除的,不會產生或銷燬任何額外的對象實例
SynchronousQueue是一個不存儲元素的阻塞隊列。每一個put操作必須等待一個take操作,否則不能繼續添加元素。SynchronousQueue可以看成是一個傳球手,負責把生產者線程處理的數據直接傳遞給消費者線程。隊列本身並不存儲任何元素,非常適合於傳遞性場景,比如在一個線程中使用的數據,傳遞給另外一個線程使用,SynchronousQueue的吞吐量高於LinkedBlockingQueue 和 ArrayBlockingQueue。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章