參考:https://cloud.tencent.com/developer/article/1340017
內(nèi)存方面
ArrayBlockingQueue
用于存儲(chǔ)隊(duì)列元素的存儲(chǔ)空間是預(yù)先分配的柳琢,使用過(guò)程中內(nèi)存開銷較小(無(wú)須動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間)
LinkedBlockingQueue
用于存儲(chǔ)隊(duì)列元素的存儲(chǔ)空間是在其使用過(guò)程中動(dòng)態(tài)分配的,因此它可能會(huì)增加JVM垃圾回收的負(fù)擔(dān)诗茎。
有界無(wú)界
ArrayBlockingQueue
有界锻煌,適合已知最大存儲(chǔ)容量的場(chǎng)景
LinkedBlockingQueue
可有界可以無(wú)界
吞吐量
LinkedBlockingQueue在大多數(shù)并發(fā)的場(chǎng)景下吞吐量比ArrayBlockingQueue赶舆,但是性能不穩(wěn)定。
Linked queues typically have higher throughput than array-based queues but less predictable performance in most concurrent applications.
這個(gè)主要針對(duì)LinkedBlockingQueue是無(wú)界的場(chǎng)景來(lái)說(shuō)璃俗,由于無(wú)界套利,所以offer以及poll的吞吐量通常比ArrayBlockingQueue高推励。
應(yīng)用場(chǎng)景
按照適用的并發(fā)強(qiáng)度從低到高排列如下:
LinkedList/ArrayList ? 非線程安全鹤耍,不能用于并發(fā)場(chǎng)景(List的方法支持棧和隊(duì)列的操作,因此可以用List封裝成stack和queue)
Collections.synchronizedList ? 使用wrapper class封裝验辞,每個(gè)方法都用synchronized(mutex:Object)做了同步
LinkedBlockingQueue?? 采用了鎖分離的設(shè)計(jì)稿黄,避免了讀/寫操作沖突,且自動(dòng)負(fù)載均衡跌造,可以有界杆怕。BlockingQueue在生產(chǎn)-消費(fèi)模式下首選【Iterator安全,不保證數(shù)據(jù)一致性】
ConcurrentLinkedQueue ?適用于高并發(fā)讀寫操作壳贪,理論上有最高的吞吐量陵珍,無(wú)界,不保證數(shù)據(jù)訪問(wèn)實(shí)時(shí)一致性违施,Iterator不拋出并發(fā)修改異常互纯,采用CAS機(jī)制實(shí)現(xiàn)無(wú)鎖訪問(wèn)。