java中LinkedBlockingQueue與ArrayBlockingQueue的異同_java

來源:互聯網
上載者:User

相同:

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類型來統計元素

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.