黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java多線程編程概述
Java多線程的安全問(wèn)題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設(shè)計(jì)技術(shù)
Java鎖的優(yōu)化及注意事項(xiàng)
Java多線程集合
【Java多線程】單例模式與多線程

Java并發(fā)集合

在JDK1.5中引入了java.util.concurrent包,在該包中定義了一組線程安全的集合,稱(chēng)為并發(fā)集合, 這些集合可以作為同步集合的替代品。

非線程安全的集合 并發(fā)集合 共同接口
ArrayList CopyOnWriteArrayList List
LinkedList ConcurrentLinkedQueue Queue
HashSet CopyOnWriteArraySet Set
TreeSet ConcurrentSkipListSet SortedSet
HashMap ConcurrentHashMap Map
TreeMap ConcurrentSkipListMap SortedMap

并發(fā)集合實(shí)現(xiàn)線程安全的遍歷方式有兩種:

1、一個(gè)是對(duì)待遍歷集合的快照進(jìn)行遍歷. 快照(Snapshot)是指在創(chuàng)建iterator迭代器對(duì)象時(shí)給集合內(nèi)部的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建一個(gè)副本,它反映的是在迭代這一時(shí)刻的狀態(tài),每個(gè)線程在迭代遍歷集合時(shí),都會(huì)創(chuàng)建本線程的一個(gè)副本,就相當(dāng)于這個(gè)快照是線程的特有對(duì)象,所以在遍歷操作時(shí)無(wú)須加鎖. 另外快照是只讀的,因此返回的Iterator迭代器不支持remove()刪除操作. 這種快照遍歷方式優(yōu)點(diǎn)是遍歷操作與更新操作互不影響,缺點(diǎn)是集合元素非常多時(shí),創(chuàng)建快照開(kāi)銷(xiāo)比較大. CopyOnWriterArrayList與CopyOnWriteArraySet這兩個(gè)集合采用了快照遍歷方式。

2、另一種遍歷是準(zhǔn)實(shí)時(shí)遍歷,準(zhǔn)實(shí)際遍歷不是針對(duì)副本遍歷,也不使用鎖來(lái)保障線程安全,遍歷操作與更新可以并發(fā)進(jìn)行,這種遍歷方式支持迭代器的remove()操作的, 你刪除后可能會(huì)在其他線程遍歷時(shí)立即就反映出來(lái)ConcurrentLinkedQueue和ConcurrentHashMap等并發(fā)集合采用了這種準(zhǔn)實(shí)時(shí)遍歷方式。

并發(fā)集合內(nèi)部在保障線程安全的時(shí)候不使用鎖,采用CAS操作,或者對(duì)鎖進(jìn)行優(yōu)化,如使用粒度極小的鎖.相對(duì)于同步集合,使用并發(fā)集合的程序的吞吐率提升非常明顯,同步集合的程序隨著并發(fā)數(shù)量的增長(zhǎng),會(huì)使得集合內(nèi)部所使用鎖的爭(zhēng)用所導(dǎo)致的線程上下文切換加劇。

CopyOnWriterArrayList集合

ArrayList集合是使用比較頻繁的一個(gè)集合, 它底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,底層是通過(guò)數(shù)組來(lái)存儲(chǔ)集合中的元素,它不是線程安全的. 開(kāi)發(fā)多線程程序,可以使用同步集合Vector,或者調(diào)用Collections.synchronizedList()把不是線程安全的ArrayList轉(zhuǎn)換為線程安全的。

在很多應(yīng)用場(chǎng)合下,讀操作可能遠(yuǎn)遠(yuǎn)大于寫(xiě)操作,希望讀操作可以盡可能的快,寫(xiě)操作慢一些也沒(méi)有關(guān)系.讀操作不會(huì)修改原來(lái)的數(shù)據(jù),因此每次在讀操作進(jìn)行加鎖是一種資源浪費(fèi),在同步集合Vector與Collections.synchronizedList()返回的線程安全集合中,每次在讀數(shù)據(jù)時(shí)都會(huì)進(jìn)行加鎖同步,它們讀取數(shù)據(jù)的效率就低. 根據(jù)讀寫(xiě)鎖思想,讀鎖與讀鎖不沖突,讀操作會(huì)受到寫(xiě)操作的阻礙,在寫(xiě)操作時(shí),讀操作必須進(jìn)行等待,如果在讀操作時(shí),寫(xiě)操作也需要等待。

為了將讀取的性能發(fā)揮到極致,在JDK5中引用了CopyOnWriteArrayList集合, 該集合在讀取數(shù)據(jù)時(shí)完全不用加鎖,并且寫(xiě)操作也不會(huì)阻塞讀操作. 從集合類(lèi)名來(lái)看CopyOnWrite就是在寫(xiě)入操作時(shí),進(jìn)行一次自我復(fù)制.即當(dāng)向集合寫(xiě)入數(shù)據(jù)并不修改原有的內(nèi)容, 而是把集合中原來(lái)的從容復(fù)制到一個(gè)副本中,向副本中寫(xiě)入數(shù)據(jù),寫(xiě)完后再將副本替換原來(lái)的數(shù)據(jù)。

CopyOnWriteArrayList集合采用快照遍歷,在迭代時(shí),不支持刪除操作。

ConcurrentLinkedQueue

ConcurrentLinkedQueue類(lèi)可以看作是LinkedList類(lèi)的線程安全版, 可以作為Collections.sychronizedList(LinkedList)替代品. ConcurrentLinkedQueue內(nèi)部訪問(wèn)共享狀態(tài)變量(隊(duì)首與隊(duì)尾指針)時(shí)并不使用鎖,而是使用CAS操作來(lái)保障線程安全的. ConcurrentLinkedQueue是非阻塞的,避免了上下文切換需要的開(kāi)銷(xiāo).遍歷方式是準(zhǔn)實(shí)時(shí). 與BlockingQueue阻塞隊(duì)列比,ConcurrentLinkedQueue更適合更新操作與遍歷操作并發(fā)的情況, 有若干的線程往/從隊(duì)列中添加/刪除操作,還有若干的線程讀取集合中的數(shù)據(jù)。

BlockingQueue阻塞隊(duì)列

ConcurrentLinkedQueue是一個(gè)高效的讀寫(xiě)隊(duì)列,在多線程中可以使用BlockingQueue阻塞隊(duì)列在線程之間共享數(shù)據(jù)。

BlockingQueue是一個(gè)接口,主要有兩個(gè)實(shí)現(xiàn)類(lèi)ArrayBlockingQueue與LinkedBlockingQueue. ArrayBlockingQueue是基于數(shù)組實(shí)現(xiàn)的,更適合做有界隊(duì)列,在隊(duì)列中存儲(chǔ)元素的容量可以在創(chuàng)建隊(duì)列時(shí)指定; LinkedBlockingQueue基于鏈表實(shí)現(xiàn)的,適合做無(wú)界隊(duì)列,因?yàn)閮?nèi)部元素可以動(dòng)態(tài)的增加。

BlockingQueue阻塞隊(duì)列有兩個(gè)常用的操作:put()與take(). put()方法是將元素添加到隊(duì)列的尾部,如果隊(duì)列滿了,它會(huì)一直等待,直到隊(duì)列中有空閑的位置; take()會(huì)從隊(duì)列的頭部取出一個(gè)元素,如果隊(duì)列為空會(huì)一直等待,等到隊(duì)列中有可用元素再取。

ConcurrentHashMap集合

HashTable是一個(gè)同步集合,在某個(gè)線程操作HashTable期間不允許其他線程參與。

Collections.synchronizedMap(Map)可以返回一個(gè)線程安全的集合,采用了裝飾器模式,在該線程安全的集合內(nèi)部,先要獲得mutex鎖,并發(fā)效率低。

ConcurrentHashMap是一種高并發(fā)的線程安全的Map集合,可以看作是HashTable的替代品. 在JDK7前,ConcurrentHashMap內(nèi)部使用粒度極小的鎖來(lái)保障線程安全,或者說(shuō)采用了分段鎖協(xié)議,默認(rèn)情況下可以支持16個(gè)線程并發(fā)操作. 在JDK8中對(duì)ConcurrentHashMap集合進(jìn)行了性能提升,采用CAS操作實(shí)現(xiàn)線程安全。

隨機(jī)數(shù)據(jù)結(jié)構(gòu):SkipList跳表

跳表是一種可以用來(lái)快速查詢的數(shù)據(jù)結(jié)構(gòu).與平衡樹(shù)相比,在對(duì)跳表插入/刪除操作時(shí),只需要對(duì)整數(shù)數(shù)據(jù)結(jié)構(gòu)的局部進(jìn)行操作即可,即在高并發(fā)的情況下, 你可能需要一個(gè)全局的鎖來(lái)保障整個(gè)平衡樹(shù)的安全,對(duì)于跳表來(lái)說(shuō),只需要部分鎖即可。

使用這一數(shù)據(jù)結(jié)構(gòu)的集合有: ConcurrentSkipListSet與ConcurrentSkipListMap集合, ConcurrentSkipListSet集合是可以對(duì)元素進(jìn)行排序的線程安全的集合, ConcurrentSkipListMap集合是可以根據(jù)鍵進(jìn)行排序的線程安全的Map集合。

全部教程
主站蜘蛛池模板: 天天做天天爱夜夜爽毛片毛片 | 国产一区二区三区在线视频 | 美女黄色在线 | 久久精品国产免费中文 | 免费人成网站免费看视频 | 欧美成人看片一区二区三区尤物 | 黄网站免费在线观看 | 亚洲综合偷自成人网第页色 | 欧美午夜理伦三级理论三级 | 国产一区二区自拍视频 | 视频黄色免费 | 天堂在线国产 | 国产精品suv一区二区 | 成年人免费毛片 | 亚洲精品人成网在线播放影院 | 两个人看的www免费 两个人看的www高清免费视频 | 国产一区三区二区中文在线 | 国产欧美日韩精品一区二 | 欧美一区二区三区免费看 | 中文日韩字幕一区在线观看 | 狠狠香蕉 | 日韩精品一区二区三区在线观看 | 男生插女生阴道视频 | 欧美成人午夜精品一区二区 | 欧美黄色片 一级片 | 欧美视频一区二区三区 | 欧美精品亚洲精品日韩专区va | 狠狠色噜噜狠狠狠狠狠色综合久久 | 99精品全国免费观看视频.. | 最近最好的中文字幕2019免费 | 日韩一级片免费看 | 久久综合九色综合97婷婷女人 | 日韩欧美片 | xx欧美 | 国产成人精品永久免费视频 | 久久午夜鲁丝片午夜精品 | 巨胸喷奶水www久久久 | 日日噜噜夜夜狠狠久久aⅴ 日日噜噜夜夜狠狠久久丁香七 | 亚洲黄色网址在线观看 | 亚洲va在线va天堂va手机 | 一个人免费观看视频www |