java集合中的線程安全-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)java集合中的線程安全,以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)專業(yè)提供成都棕樹電信機(jī)房服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買成都棕樹電信機(jī)房服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。

線程安全

首先要明白線程的工作原理,jvm有一個(gè)main memory,而每個(gè)線程有自己的working

memory,一個(gè)線程對(duì)一個(gè)variable進(jìn)行操作時(shí),都要在自己的working

memory里面建立一個(gè)copy,操作完之后再寫入main

memory。多個(gè)線程同時(shí)操作同一個(gè)variable,就可能會(huì)出現(xiàn)不可預(yù)知的結(jié)果。根據(jù)上面的解釋,很容易想出相應(yīng)的scenario。

而用synchronized的關(guān)鍵是建立一個(gè)monitor,這個(gè)monitor可以是要修改的variable也可以其他你認(rèn)為合適的object比如method,然后通過給這個(gè)monitor加鎖來實(shí)現(xiàn)線程安全,每個(gè)線程在獲得這個(gè)鎖之后,要執(zhí)行完load到workingmemory -> use&assign -> store到mainmemory 的過程,才會(huì)釋放它得到的鎖。這樣就實(shí)現(xiàn)了所謂的線程安全。

什么是線程安全?線程安全是怎么完成的(原理)? 線程安全就是說多線程訪問同一代碼,不會(huì)產(chǎn)生不確定的結(jié)果。編寫線程安全的代碼是低依靠線程同步。

java相關(guān)集合

Vector、ArrayList、LinkedList

Vector和ArrayList在使用上非常相似,都可用來表示一組數(shù)量可變的對(duì)象應(yīng)用的集合,并且可以隨機(jī)地訪問其中的元素。

Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。

ArrayList和LinkedList區(qū)別

對(duì)于處理一列數(shù)據(jù)項(xiàng),Java提供了兩個(gè)類ArrayList和LinkedList,ArrayList的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object[],所以從概念上講,它更象數(shù)組,但LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,所以,它更象一個(gè)鏈表結(jié)構(gòu),所以,它們?cè)谛阅苌嫌泻艽蟮牟顒e。

從上面的分析可知,在ArrayList的前面或中間插入數(shù)據(jù)時(shí),你必須將其后的所有數(shù)據(jù)相應(yīng)的后移,這樣必然要花費(fèi)較多時(shí)間,所以,當(dāng)你的操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能

而訪問鏈表中的某個(gè)元素時(shí),就必須從鏈表的一端開始沿著連接方向一個(gè)一個(gè)元素地去查找,直到找到所需的元素為止,所以,當(dāng)你的操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時(shí),就應(yīng)該使用LinkedList了。

如果在編程中,1,2兩種情形交替出現(xiàn),這時(shí),你可以考慮使用List這樣的通用接口,而不用關(guān)心具體的實(shí)現(xiàn),在具體的情形下,它的性能由具體的實(shí)現(xiàn)來保證。

HashTable,HashMap,HashSet

HashTable和HashMap采用相同的存儲(chǔ)機(jī)制,二者的實(shí)現(xiàn)基本一致,不同的是:

1)、HashMap是非線程安全的,HashTable是線程安全的,內(nèi)部的方法基本都是synchronized。

2)、HashTable不允許有null值的存在。

在HashTable中調(diào)用put方法時(shí),如果key為null,直接拋出NullPointerException。其它細(xì)微的差別還有,比如初始化Entry數(shù)組的大小等等,但基本思想和HashMap一樣。

HashSet:

1、HashSet基于HashMap實(shí)現(xiàn),無容量限制。

2、HashSet是非線程安全的。

3、HashSet不保證有序。

HashMap:

1、HashMap采用數(shù)組方式存儲(chǔ)key,value構(gòu)成的Entry對(duì)象,無容量限制。

2、HashMap基于Key hash查找Entry對(duì)象存放到數(shù)組的位置,對(duì)于hash沖突采用鏈表的方式來解決。

3、HashMap在插入元素時(shí)可能會(huì)要擴(kuò)大數(shù)組的容量,在擴(kuò)大容量時(shí)須要重新計(jì)算hash,并復(fù)制對(duì)象到新的數(shù)組中。

4、HashMap是非線程安全的。

5、HashMap遍歷使用的是Iterator

HashTable

1、HashTable是線程安全的。

2、HashTable中無論是Key,還是Value都不允許為null。

3、HashTable遍歷使用的是Enumeration。

TreeSet,TreeMap

TreeSet:

1、TreeSet基于TreeMap實(shí)現(xiàn),支持排序。

2、TreeSet是非線程安全的。

從對(duì)HashSet和TreeSet的描述來看,TreeSet和HashSet一樣,也是完全基于Map來實(shí)現(xiàn)的,并且都不支持get(int)來獲取指定位置的元素(需要遍歷獲取),另外TreeSet還提供了一些排序方面的支持。例如傳入Comparator實(shí)現(xiàn)、descendingSet以及descendingIterator等。

TreeMap:

1、TreeMap是一個(gè)典型的基于紅黑樹的Map實(shí)現(xiàn),因此它要求一定要有Key比較的方法,要么傳入Comparator實(shí)現(xiàn),要么key對(duì)象實(shí)現(xiàn)Comparable接口。

2、TreeMap是非線程安全的。

上述就是小編為大家分享的java集合中的線程安全了,如果您也有類似的疑惑,不妨參照上述方法進(jìn)行嘗試。如果想了解更多相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前題目:java集合中的線程安全-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article36/dpegpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站收錄品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司服務(wù)器托管、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司