一、并發(fā)List
1、Vector
List類簇中ArrayList和Vector的主要區(qū)別就是Vector的大部分實(shí)現(xiàn)都支持線程安全,代碼也展示了一部分。
另外如果使用到ArrayList有需要進(jìn)行線程安全控制,可以調(diào)Collections.synchronizedList(arrayList) 傳入ArrayList。
2、CopyOnWriteArrayList
實(shí)現(xiàn)機(jī)制:當(dāng)對(duì)象進(jìn)行讀操作時(shí),由于對(duì)象未發(fā)生改變,無需進(jìn)行加鎖同步;執(zhí)行寫操作,試圖改變對(duì)象時(shí),則復(fù)制該對(duì)象先獲取該對(duì)象的副本,對(duì)副本進(jìn)行修改,最后將副本寫回。這種實(shí)現(xiàn)方法減少了鎖競(jìng)爭(zhēng),提高了高并發(fā)時(shí)讀的性能,但寫操作有所犧牲。
對(duì)比CopyOnWriteArrayList和Vector的get方法實(shí)現(xiàn)可以得知:



Vector采用synchronized?關(guān)鍵字,所有的get操作都需要先獲取對(duì)象鎖才能進(jìn)行。在高并發(fā)情況下,大量的鎖競(jìng)爭(zhēng)也會(huì)降低系統(tǒng)性能。所以在多讀少寫的需求中應(yīng)優(yōu)先使用CopyOnWriteArrayList,而少讀多寫時(shí)使用vector,做好合理選擇就行。
二、并發(fā)Set
1、CopyOnWriteArraySet-內(nèi)部實(shí)現(xiàn)完全依賴于CopyOnWriteArrayList,同樣也適用于讀多寫少的并發(fā)場(chǎng)合。應(yīng)對(duì)并發(fā)寫時(shí),可以調(diào)用Collections.sysnchronizedSet方法得到一個(gè)線程安全的set集合。
三、并發(fā)Map
1、ConcurrentHashMap
? ? Map類簇中的HashTable是底層添加了線程安全控制的map數(shù)據(jù)結(jié)構(gòu),但在高并發(fā)環(huán)境下效率低下,因?yàn)樗性L問HashTable的線程都必須競(jìng)爭(zhēng)同一把鎖,造成大量線程競(jìng)爭(zhēng)鎖。
而ConcurrentHashMap把數(shù)據(jù)進(jìn)行分塊加鎖,也就是使用鎖分離技術(shù),添加多把鎖,每一把鎖作用于一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線程間會(huì)減少鎖競(jìng)爭(zhēng),從而可以有效提高并發(fā)訪問效率,ConcurrentHashMap使用鎖分段技術(shù)提高并發(fā)讀寫效率。
具體查看源碼可知,ConcurrentHashMap的get方法都是無鎖的,為多線程并發(fā)下的性能提供了保證。

這也警示開發(fā)人員,在高并發(fā)下,既要保證線程安全,又需要合理是用安全控制技術(shù),例如添加關(guān)鍵字、各種Lock類型。否則造成線程惡性競(jìng)爭(zhēng)鎖,或者死鎖現(xiàn)象,程序最終潰堤。
2、Collections.synchronizedMap(map)
對(duì)于未進(jìn)行線程安全控制的map結(jié)果,也可通過Collections類提供的synchronizedMap進(jìn)行控制。
四、并發(fā)Queue

1、ConcurrentLinkedQueue-高性能隊(duì)列
ConcurrentLinkedQueue是適用于高并發(fā)下的隊(duì)列類型。通過無鎖的方式實(shí)現(xiàn)。
2、BlockingQueue-阻塞隊(duì)列
BlockingQueue的應(yīng)用場(chǎng)景主要是用于線程間數(shù)據(jù)共享,在生產(chǎn)者-消費(fèi)者模式中,作為一個(gè)數(shù)據(jù)倉(cāng)庫(kù),生產(chǎn)者往里put數(shù)據(jù),消費(fèi)者poll數(shù)據(jù)。當(dāng)隊(duì)列被裝滿了,當(dāng)生產(chǎn)者在試圖往里放數(shù)據(jù)時(shí),就會(huì)被阻塞等待。這里就涉及到相關(guān)的任務(wù)處理策略和拒絕服務(wù)策略。在上文中都有具體講述。?
五、總結(jié)
并發(fā)的數(shù)據(jù)結(jié)構(gòu)主要就是這些,List的 Vector(synchronized?關(guān)鍵字,讀少寫多) 和CopyOnWriteArrayList(復(fù)制副本,讀多寫少),Set的CopyOnWriteArraySet(特點(diǎn)同CopyOnWriteArrayList),Map的 ConcurrentHashMap(鎖分離,減少鎖競(jìng)爭(zhēng)),還有隊(duì)列Queue的ConcurrentLinkedQueue(并發(fā)),BlockingQueue(數(shù)據(jù)共享);另外還有Collections提供的一系列synchroniz...方法用于對(duì)普通數(shù)據(jù)結(jié)果進(jìn)行線程安全控制。
當(dāng)leader得知人善用,做程序也是一樣。糊里糊涂的隨便new一些數(shù)據(jù)結(jié)構(gòu),卻不清楚初始化這個(gè)對(duì)象,它的長(zhǎng)處與弊端。而處理高并發(fā)大數(shù)據(jù)量系統(tǒng),就得在這些細(xì)節(jié)上花些功夫?;A(chǔ)才是一座城堡屹立不倒的核心。再多的負(fù)載、服務(wù)治理,也得基礎(chǔ)好。
原文鏈接:http://blog.csdn.net/Daybreak1209/article/details/51415995