LinkedBlockingQueue和ArrayBlockingQueue都是Java中常用的阻塞隊列實現(xiàn)類辨萍,它們之間的主要區(qū)別如下
1勉躺、數(shù)據(jù)結(jié)構(gòu)不同:LinkedBlockingQueue采用鏈表實現(xiàn)鱼鼓,而ArrayBlockingQueue采用數(shù)組實現(xiàn)丸边。
2典格、容量限制不同:ArrayBlockingQueue在創(chuàng)建時需要指定容量母怜,而LinkedBlockingQueue則可以在創(chuàng)建時不指定容量,或者指定一個可選的容量參數(shù),如果不指定容量辩蛋,則默認容量為Integer.MAX_VALUE呻畸。
3、隊列的操作性能不同:LinkedBlockingQueue對于元素的插入和刪除操作悼院,由于采用鏈表實現(xiàn)伤为,因此性能比較高。而對于隨機訪問元素的操作据途,由于需要遍歷鏈表绞愚,因此性能比較低。ArrayBlockingQueue對于插入和刪除操作颖医,由于采用數(shù)組實現(xiàn)位衩,因此性能比較低,而對于隨機訪問操作熔萧,性能比較高糖驴。
4、GC壓力:LinkedBlockingQueue內(nèi)部維護的是一個鏈表結(jié)構(gòu)佛致,在生產(chǎn)和消費的時候贮缕,需要創(chuàng)建Node對象進行插入或移除,大批量數(shù)據(jù)的系統(tǒng)中晌杰,其對于GC的壓力比較大跷睦。而ArrayBlockingQueue內(nèi)部維護了一個數(shù)組,在生產(chǎn)和消費的時候肋演,是直接將枚舉對象插入或移除的抑诸,不會產(chǎn)生或銷毀任何額外的對象實例。
5爹殊、clear()機制不同:LinkedBlockingQueue的clear()方法中蜕乡,會加兩把鎖。ArrayBlockingQueue的clear()方法中只加一把鎖梗夸。
6层玲、鎖機制不同:LinkedBlockingQueue中的鎖是分離的,生產(chǎn)者的鎖為putLock反症,消費者的鎖為takeLock辛块。而ArrayBlockingQueue生產(chǎn)者和消費者使用的是同一把鎖。
7铅碍、LinkedBlockingQueue和ArrayBlockingQueue都是阻塞隊列润绵,支持阻塞操作。內(nèi)部是使用ReentrantLock和Condition來保證生產(chǎn)和消費的同步胞谈;當隊列為空尘盼,消費線程被阻塞憨愉;當隊列裝滿,生產(chǎn)線程被阻塞卿捎。