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