LinkedBlockingQueue和ArrayBlockingQueue的異同


相同:

1、LinkedBlockingQueue和ArrayBlockingQueue都實現了BlockingQueue接口;

2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的隊列

  內部都是使用ReentrantLock和Condition來保證生產和消費的同步;

  當隊列為空,消費者線程被阻塞;當隊列裝滿,生產者線程被阻塞;

使用Condition的方法來同步和通信:await()和signal()

不同:

1、由上圖可以看出,他們的鎖機制不同

  LinkedBlockingQueue中的鎖是分離的,生產者的鎖PutLock,消費者的鎖takeLock

  而ArrayBlockingQueue生產者和消費者使用的是同一把鎖;

2、他們的底層實現機制也不同

  LinkedBlockingQueue內部維護的是一個鏈表結構

在生產和消費的時候,需要創建Node對象進行插入或移除,大批量數據的系統中,其對於GC的壓力會比較大

  而ArrayBlockingQueue內部維護了一個數組

在生產和消費的時候,是直接將枚舉對象插入或移除的,不會產生或銷毀任何額外的對象實例

 3、構造時候的區別

  LinkedBlockingQueue有默認的容量大小為:Integer.MAX_VALUE,當然也可以傳入指定的容量大小

  ArrayBlockingQueue在初始化的時候,必須傳入一個容量大小的值

  看其提供的構造方法就能知道

4、執行clear()方法

  LinkedBlockingQueue執行clear方法時,會加上兩把鎖

 5、統計元素的個數

  LinkedBlockingQueue中使用了一個AtomicInteger對象來統計元素的個數

  ArrayBlockingQueue則使用int類型來統計元素

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM