http://blog.csdn.net/Daybreak1209/article/details/51415995
一、并發(fā)List 1、Vector 在java核心數(shù)據(jù)結(jié)構(gòu)(一)——List類族一文中已經(jīng)提到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)對象進(jìn)行讀操作時,由于對象未發(fā)生改變,無需進(jìn)行加鎖同步;執(zhí)行寫操作,試圖改變對象時,則復(fù)制該對象先獲取該對象的副本,對副本進(jìn)行修改,最后將副本寫回。這種實(shí)現(xiàn)方法減少了鎖競爭,提高了高并發(fā)時讀的性能,但寫操作有所犧牲。 對比CopyOnWriteArrayList和Vector的get方法實(shí)現(xiàn)可以得知: Vector采用synchronized 關(guān)鍵字,所有的get操作都需要先獲取對象鎖才能進(jìn)行。在高并發(fā)情況下,大量的鎖競爭也會降低系統(tǒng)性能。所以在多讀少寫的需求中應(yīng)優(yōu)先使用CopyOnWriteArrayList,而少讀多寫時使用vector,做好合理選擇就行。
二、并發(fā)Set 1、CopyOnWriteArraySet-內(nèi)部實(shí)現(xiàn)完全依賴于CopyOnWriteArrayList,同樣也適用于讀多寫少的并發(fā)場合。 應(yīng)對并發(fā)寫時,可以調(diào)用Collections.sysnchronizedSet方法得到一個線程安全的set集合。
三、并發(fā)Map 1、ConcurrentHashMap Map類簇中的HashTable是底層添加了線程安全控制的map數(shù)據(jù)結(jié)構(gòu),但在高并發(fā)環(huán)境下效率低下,因?yàn)樗性L問HashTable的線程都必須競爭同一把鎖,造成大量線程競爭鎖。 而ConcurrentHashMap把數(shù)據(jù)進(jìn)行分塊加鎖,也就是使用鎖分離技術(shù),添加多把鎖,每一把鎖作用于一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問不同數(shù)據(jù)段的數(shù)據(jù)時,線程間會減少鎖競爭,從而可以有效提高并發(fā)訪問效率,ConcurrentHashMap使用鎖分段技術(shù)提高并發(fā)讀寫效率。
具體查看源碼可知,ConcurrentHashMap的get方法都是無鎖的,為多線程并發(fā)下的性能提供了保證。 這也警示開發(fā)人員,在高并發(fā)下,既要保證線程安全,又需要合理是用安全控制技術(shù),例如添加關(guān)鍵字、各種Lock類型。否則造成線程惡性競爭鎖,或者死鎖現(xiàn)象,程序最終潰堤。
2、Collections.synchronizedMap(map) 對于未進(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)用場景主要是用于線程間數(shù)據(jù)共享,在生產(chǎn)者-消費(fèi)者模式中(java線程深度解析(五)——并發(fā)模型(生產(chǎn)者-消費(fèi)者)文中有介紹),作為一個數(shù)據(jù)倉庫,生產(chǎn)者往里put數(shù)據(jù),消費(fèi)者poll數(shù)據(jù)。當(dāng)隊(duì)列被裝滿了,當(dāng)生產(chǎn)者在試圖往里放數(shù)據(jù)時,就會被阻塞等待。這里就涉及到相關(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(鎖分離,減少鎖競爭),還有隊(duì)列Queue的ConcurrentLinkedQueue(并發(fā)),BlockingQueue(數(shù)據(jù)共享);另外還有Collections提供的一系列synchroniz...方法用于對普通數(shù)據(jù)結(jié)果進(jìn)行線程安全控制。 當(dāng)leader得知人善用,做程序也是一樣。糊里糊涂的隨便new一些數(shù)據(jù)結(jié)構(gòu),卻不清楚初始化這個對象,它的長處與弊端。而處理高并發(fā)大數(shù)據(jù)量系統(tǒng),就得在這些細(xì)節(jié)上花些功夫?;A(chǔ)才是一座城堡屹立不倒的核心。再多的負(fù)載、服務(wù)治理,也得基礎(chǔ)好。 筆者拙見,歡迎斧正。 |
|