java中LinkedBlockingQueue與ArrayBlockingQueue的異同
相同:
1、LinkedBlockingQueue和ArrayBlockingQueue都實現(xiàn)了BlockingQueue接口;
2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的隊列
內(nèi)部都是使用ReentrantLock和Condition來保證生產(chǎn)和消費的同步;
當(dāng)隊列為空,消費者線程被阻塞;當(dāng)隊列裝滿,生產(chǎn)者線程被阻塞;


使用Condition的方法來同步和通信:await()和signal()
不同:
1、由上圖可以看出,他們的鎖機制不同
LinkedBlockingQueue中的鎖是分離的,生產(chǎn)者的鎖PutLock,消費者的鎖takeLock
而ArrayBlockingQueue生產(chǎn)者和消費者使用的是同一把鎖;
2、他們的底層實現(xiàn)機制也不同
LinkedBlockingQueue內(nèi)部維護的是一個鏈表結(jié)構(gòu)


在生產(chǎn)和消費的時候,需要創(chuàng)建Node對象進行插入或移除,大批量數(shù)據(jù)的系統(tǒng)中,其對于GC的壓力會比較大
而ArrayBlockingQueue內(nèi)部維護了一個數(shù)組

在生產(chǎn)和消費的時候,是直接將枚舉對象插入或移除的,不會產(chǎn)生或銷毀任何額外的對象實例
3、構(gòu)造時候的區(qū)別
LinkedBlockingQueue有默認的容量大小為:Integer.MAX_VALUE,當(dāng)然也可以傳入指定的容量大小

ArrayBlockingQueue在初始化的時候,必須傳入一個容量大小的值
看其提供的構(gòu)造方法就能知道

4、執(zhí)行clear()方法
LinkedBlockingQueue執(zhí)行clear方法時,會加上兩把鎖

5、統(tǒng)計元素的個數(shù)
LinkedBlockingQueue中使用了一個AtomicInteger對象來統(tǒng)計元素的個數(shù)

ArrayBlockingQueue則使用int類型來統(tǒng)計元素
相關(guān)文章
spring cloud zuul 與 sentinel的結(jié)合使用操作
這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
spring-boot實現(xiàn)增加自定義filter(新)
本篇文章主要介紹了spring-boot實現(xiàn)增加自定義filter(新),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

