本文作者:王一飛婿牍,叩丁狼高級(jí)講師监嗜。原創(chuàng)文章谐檀,轉(zhuǎn)載請(qǐng)注明出處。
到這裁奇, 線程的并發(fā)容器介紹就完成了桐猬, 來做一個(gè)大總結(jié):
List集合
SynchronizedList :一個(gè)由普通list轉(zhuǎn)換而來的線程安全集合
List list = Collections.synchronizedList(new LinkedList(...));
CopyOnWriteArrayList :一種讀寫安全的ArrayList集合
CopyOnWriteArrayList類是線程安全的容器,但它的安全是有一定的限制的刽肠。他的線程安全操作針對(duì)是并發(fā)環(huán)境下線程讀與寫安全溃肪。簡(jiǎn)單的講, 它只能保證, 一邊線程主讀(遍歷/獲取), 一邊線程主寫(添加/刪除/修改)操作上的安全。如果一邊線程讀寫復(fù)合操作音五,另一邊線程也讀寫復(fù)合操作惫撰,那它也無能為力啦。
Map集合
SynchronizedMap:一個(gè)由普通Map轉(zhuǎn)換而來的線程安全map集合
Map synchronizedMap = Collections.synchronizedMap(new HashMap());
ConcurrentHashMap:jdk7以前:一種將Map分段(Segment)鎖定的線程按照Map jdk8以后:一種使用Node + CAS + Synchronized 保證安全的Map
jdk7以前:
ConcurrentHashMap和HashMap設(shè)計(jì)思路差不多躺涝,但是為支持并發(fā)操作厨钻,做了一定的改進(jìn),ConcurrentHashMap引入Segment 的概念坚嗜,目的是將map拆分成多個(gè)Segment(默認(rèn)16個(gè))莉撇。操作ConcurrentHashMap細(xì)化到操作某一個(gè)Segment。在多線程環(huán)境下惶傻,不同線程操作不同的Segment,他們互不影響其障,這便可實(shí)現(xiàn)并發(fā)操作银室。
jdk8以后:
jdk8版本的ConcurrentHashMap直接拋棄了Segment的設(shè)計(jì),采用了較為輕捷的Node + CAS + Synchronized技術(shù)組合設(shè)計(jì)励翼,保證線程安全蜈敢。
Queue隊(duì)列
阻塞類:
ArrayBlockingQueue :一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
ArrayBlockingQueue 底層是一個(gè)有界數(shù)組汽抚,遵循FIFO原則抓狭,對(duì)進(jìn)入的元素進(jìn)行排序,先進(jìn)先出造烁。其使用ReentrantLock鎖否过,再配合兩種Condition實(shí)現(xiàn)隊(duì)列的線程安全操作。并發(fā)環(huán)境下ArrayBlockingQueue 使用頻率較高,另外,其還支持公平與非公平2種操作策略惭蟋,在創(chuàng)建對(duì)象時(shí)通過構(gòu)造函數(shù)將fair參數(shù)設(shè)置為true/false即可苗桂,需要注意的是,如果fair設(shè)置為false告组,表示持有公平鎖煤伟,這種操作會(huì)降低系統(tǒng)吞吐量,慎用。
LinkedBlockingQueue :一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列便锨。
LinkedBlockingQueue 一個(gè)基于鏈表而實(shí)現(xiàn)的有界阻塞隊(duì)列围辙。遵循先進(jìn)先出原則,由隊(duì)頭入列放案,再從隊(duì)尾出列姚建。具體操作上跟ArrayBlockingQueue類似,區(qū)別在于底層維護(hù)數(shù)據(jù)上卿叽,LinkedBlockingQueue底層是一個(gè)鏈接桥胞,而ArrayBlockingQueue是一個(gè)數(shù)組。
LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列考婴。
LinkedBlockingDeque 跟LinkedBlockingQueue 實(shí)現(xiàn)原理一樣,區(qū)別是它是雙向的
PriorityBlockingQueue :一個(gè)支持優(yōu)先級(jí)排序的無界阻塞隊(duì)列贩虾。
PriorityBlockingQueue 是有一個(gè)帶有優(yōu)先級(jí)級(jí)別的無界阻塞隊(duì)列,不支持null元素入列沥阱,并且要求隊(duì)列對(duì)象必須為可以比較對(duì)象缎罢。這點(diǎn)跟PriorityQueue類 類似,區(qū)別是PriorityBlockingQueue 帶有阻塞功能考杉。
DelayQueue:一個(gè)具有延時(shí)等待效果無界阻塞隊(duì)列策精。
DelayQueue一個(gè)無界阻塞隊(duì)列,里面元素都實(shí)現(xiàn)Delayed接口崇棠,要求實(shí)現(xiàn)延期策略方法(getDelay)咽袜。在操作隊(duì)列時(shí),只有在延遲期滿時(shí)才能從隊(duì)列中提取元素枕稀。如果所有元素延遲都還沒有期滿询刹,則隊(duì)列沒有頭部,使用poll時(shí)將返回 null萎坷。當(dāng)元素到期,而該元素不是頭部元素,繼續(xù)等待.
SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列凹联。
SynchronousQueue一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,支持公平鎖和非公平鎖.每一次操作必須配置,即一次put操作必須等待一次take操作哆档,否則不能添加元素蔽挠。
非阻塞類:
ConcurrentLinkedQueue:一個(gè)基于鏈表的無界線程安全的隊(duì)列
ConcurrentLinkedQueue 是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全的隊(duì)列,按照先進(jìn)先出原則對(duì)元素進(jìn)行排序瓜浸。新元素從隊(duì)列尾部插入澳淑,而獲取隊(duì)列元素,則需要從隊(duì)列頭部獲取插佛。
PriorityQueue:一個(gè)基于優(yōu)先級(jí)的無界線程不安全隊(duì)列
PriorityQueue 一個(gè)基于優(yōu)先級(jí)的無界優(yōu)先級(jí)隊(duì)列偶惠。優(yōu)先級(jí)隊(duì)列的元素按照其自然順序進(jìn)行排序,或者根據(jù)構(gòu)造隊(duì)列時(shí)提供的 Comparator 進(jìn)行排序朗涩,具體取決于所使用的構(gòu)造方法忽孽。該隊(duì)列不允許使用 null 元素也不允許插入不可比較的對(duì)象(沒有實(shí)現(xiàn)Comparable接口的對(duì)象)。