Java多線程:線程安全和非線程安全的集合對象

概念

1. 線程安全:就是當多線程訪問時,采用了加鎖的機制赞庶;即當一個線程訪問該類的某個數(shù)據(jù)時训挡,會對這個數(shù)據(jù)進行保護,其他線程不能對其訪問歧强,直到該線程讀取完之后舍哄,其他線程才可以使用。防止出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)被污染的情況誊锭。

2.線程不安全:就是不提供數(shù)據(jù)訪問時的數(shù)據(jù)保護,多個線程能夠同時操作某個數(shù)據(jù)弥锄,從而出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染的情況丧靡。

3.對于線程不安全的問題,一般會使用synchronized關鍵字加鎖同步控制籽暇。

4. 線程安全工作原理: jvm中有一個main memory對象温治,每一個線程也有自己的working memory,一個線程對于一個變量variable進行操作的時候戒悠, 都需要在自己的working memory里創(chuàng)建一個copy,操作完之后再寫入main memory。

當多個線程操作同一個變量variable,就可能出現(xiàn)不可預知的結果摩窃。

而用synchronized的關鍵是建立一個監(jiān)控monitor鳞滨,這個monitor可以是要修改的變量,也可以是其他自己認為合適的對象(方法)寒矿,然后通過給這個monitor加鎖來實現(xiàn)線程安全突琳,每個線程在獲得這個鎖之后,要執(zhí)行完加載load到working memory 到 use && 指派assign 到 存儲store 再到 main memory的過程符相。才會釋放它得到的鎖拆融。這樣就實現(xiàn)了所謂的線程安全

線程安全(Thread-safe)的集合對象:

Vector 線程安全:

HashTable 線程安全:

StringBuffer 線程安全:

非線程安全的集合對象:

ArrayList :

LinkedList:

HashMap:

HashSet:

TreeMap:

TreeSet:

StringBulider:

相關集合對象比較:

1. Vector、ArrayList、LinkedList:

1镜豹、Vector:

Vector與ArrayList一樣傲须,也是通過數(shù)組實現(xiàn)的,不同的是它支持線程的同步趟脂,即某一時刻只有一個線程能夠寫Vector泰讽,避免多線程同時寫而引起的不一致性,但實現(xiàn)同步需要很高的花費散怖,因此菇绵,訪問它比訪問ArrayList慢。

2镇眷、ArrayList:

a. 當操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或者中間咬最,并需要隨機地訪問其中的元素時,使用ArrayList性能比較好

b.ArrayList是最常用的List實現(xiàn)類欠动,內部是通過數(shù)組實現(xiàn)的永乌,它允許對元素進行快速隨機訪問。數(shù)組的缺點是每個元素之間不能有間隔具伍,當數(shù)組大小不滿足時需要增加存儲能力翅雏,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復制到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時人芽,需要對數(shù)組進行復制望几、移動、代價比較高萤厅。因此橄抹,它適合隨機查找和遍歷,不適合插入和刪除惕味。

3楼誓、LinkedList:

a. 當對一列數(shù)據(jù)的前面或者中間執(zhí)行添加或者刪除操作時,并且按照順序訪問其中的元素時名挥,要使用LinkedList

b. LinkedList是用鏈表結構存儲數(shù)據(jù)的疟羹,很適合數(shù)據(jù)的動態(tài)插入和刪除,隨機訪問和遍歷速度比較慢禀倔。另外榄融,他還提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素救湖,可以當作堆棧剃袍、隊列和雙向隊列使用。

Vector和ArrayList在使用上非常相似捎谨,都可以用來表示一組數(shù)量可變的對象應用的集合民效,并且可以隨機的訪問其中的元素憔维。

ArryList和LinkedList的區(qū)別:

在處理一列數(shù)據(jù)項時,Java提供了兩個類ArrayList和LinkedList畏邢,ArrayList的內部實現(xiàn)是基于內部數(shù)組Object[]业扒,所以從概念上說它更像數(shù)組;然而LinkedList的內部實現(xiàn)是基于一組連接的記錄舒萎,所以程储,它更像一個鏈表結構;所以它們在性能上有很大的差別臂寝。

由上可知章鲤,在ArrayList的前面或者中間插入數(shù)據(jù)的時候,必須將其后的所有數(shù)據(jù)相應的后移咆贬,這樣要花費較多的時間败徊;所以,當操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或者中間掏缎,并需要隨機地訪問其中的元素時皱蹦,使用ArrayList性能比較好。

然而訪問鏈表中的某個元素的時候眷蜈,就必須從鏈表的一端開始沪哺,沿著連接的方向一個一個元素的去查找,直到找到所需的元素為止酌儒,所以辜妓,當對一列數(shù)據(jù)的前面或者中間執(zhí)行添加或者刪除操作時,并且按照順序訪問其中的元素時忌怎,要使用LinkedList嫌拣。

如果在實際的操作中,前面兩種情況交替出現(xiàn)呆躲,可以考慮使用List這樣的通用接口,而不用關心具體的實現(xiàn)捶索,再具體的情況下插掂,它的性能由具體的實現(xiàn)來保證。

HashMap腥例、HashTable辅甥、HashSet:

HashMap和HashTable采用的存儲機制是一樣的,不同的是:

1燎竖、HashMap:

a.? 采用數(shù)組方式存儲key-value構成的Entry對象璃弄,無容量限制;

b.? 基于key hash查找Entry對象存放到數(shù)組的位置构回,對于hash沖突采用鏈表的方式去解決夏块;

c.? 在插入元素時疏咐,可能會擴大數(shù)組的容量,在擴大容量時須要重新計算hash脐供,并復制對象到新的數(shù)組中浑塞;

d.? 是非線程安全的;

e.? 遍歷使用的是Iterator迭代器政己;

2酌壕、HashTable:

a. 是線程安全的;

b. 無論是key還是value都不允許有null值的存在歇由;在HashTable中調用Put方法時卵牍,如果key為null,直接拋出NullPointerException異常沦泌;

c. 遍歷使用的是Enumeration列舉糊昙;

3、HashSet:

a. 基于HashMap實現(xiàn)赦肃,無容量限制溅蛉;

b. 是非線程安全的;

c. 不保證數(shù)據(jù)的有序他宛;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末船侧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厅各,更是在濱河造成了極大的恐慌镜撩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队塘,死亡現(xiàn)場離奇詭異袁梗,居然都是意外死亡,警方通過查閱死者的電腦和手機憔古,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門遮怜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸿市,你說我怎么就攤上這事锯梁。” “怎么了焰情?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵陌凳,是天一觀的道長。 經(jīng)常有香客問我内舟,道長合敦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任验游,我火速辦了婚禮充岛,結果婚禮上保檐,老公的妹妹穿的比我還像新娘。我一直安慰自己裸准,他們只是感情好展东,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炒俱,像睡著了一般盐肃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上权悟,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天砸王,我揣著相機與錄音,去河邊找鬼峦阁。 笑死谦铃,一個胖子當著我的面吹牛,可吹牛的內容都是我干的榔昔。 我是一名探鬼主播驹闰,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撒会!你這毒婦竟也來了嘹朗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诵肛,失蹤者是張志新(化名)和其女友劉穎屹培,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怔檩,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡褪秀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薛训。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒吗。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乙埃,靈堂內的尸體忽然破棺而出闸英,到底是詐尸還是另有隱情,我是刑警寧澤膊爪,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嚎莉,受9級特大地震影響米酬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜趋箩,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一赃额、第九天 我趴在偏房一處隱蔽的房頂上張望加派。 院中可真熱鬧,春花似錦跳芳、人聲如沸芍锦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄琉。三九已至,卻和暖如春吓歇,著一層夾襖步出監(jiān)牢的瞬間孽水,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工城看, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留女气,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓测柠,卻偏偏與公主長得像炼鞠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轰胁,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容