JAVA并發(fā)包類(lèi) - CopyOnWriteArrayList

說(shuō)明:以下內(nèi)容皆屬于個(gè)人對(duì)源碼的理解罐呼,可能存在歧義、誤解猜丹、錯(cuò)誤及理解不全面的情況,還望指正

一啤贩、CopyOnWriteArrayList介紹

CopyOnWriteArrayListArrayList的線(xiàn)程安全變體待秃。底層通過(guò)創(chuàng)建數(shù)組的新副本來(lái)實(shí)現(xiàn)并發(fā)情況下對(duì)數(shù)組的更新操作(包括add、set等方法)痹屹。這種方式通常是花費(fèi)代價(jià)比較大的,但是當(dāng)遍歷操作遠(yuǎn)大于更新操作的情況時(shí)枉氮,這種方式卻是更有效的志衍。當(dāng)然,我們需要避免并發(fā)線(xiàn)程之間的干擾聊替。CopyOnWriteArrayList允許添加所有的元素楼肪,包括Null

內(nèi)存一致性效果:與其他并發(fā)集合一樣惹悄,將對(duì)象放入CopyOnWriteArrayList之前的線(xiàn)程中的動(dòng)作發(fā)生在另一個(gè)線(xiàn)程的CopyOnWriteArrayList中訪(fǎng)問(wèn)或刪除該元素之后的操作之前春叫。

二、CopyOnWriteArrayList實(shí)現(xiàn)

  • 構(gòu)造函數(shù)
    CopyOnWriteArrayList提供了三個(gè)構(gòu)造函數(shù):默認(rèn)的構(gòu)造函數(shù)泣港,傳入指定集合的構(gòu)造函數(shù)暂殖,將指定數(shù)組拷貝到CopyOnWriteArrayList的構(gòu)造函數(shù)。目前只了解一下默認(rèn)構(gòu)造函數(shù)的實(shí)現(xiàn)当纱。
    CopyOnWriteArrayList在調(diào)用構(gòu)造函數(shù)實(shí)例化對(duì)象的時(shí)候呛每,會(huì)創(chuàng)建一個(gè)大小為0的數(shù)組對(duì)象,將CopyOnWriteArrayList底層的數(shù)組對(duì)象變量指向這個(gè)數(shù)組坡氯。這個(gè)對(duì)象變量在源碼中的定義如下:
/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;

底層數(shù)組變量array被聲明為volatile 類(lèi)型的晨横,這樣在對(duì)數(shù)組進(jìn)行遍歷的時(shí)候獲取的都是最新的值。那么并發(fā)訪(fǎng)問(wèn)數(shù)據(jù)遍歷的問(wèn)題就得以解決箫柳。
在創(chuàng)建
CopyOnWriteArrayList
對(duì)象實(shí)例時(shí)手形,同時(shí)會(huì)創(chuàng)建一個(gè)ReentranctLock的實(shí)例。

  • add(E e)方法
    調(diào)用CopyOnWriteArrayListadd()方法時(shí)悯恍,首先會(huì)用ReentranctLock實(shí)例的lock()方法獲取鎖库糠,然后獲取底層數(shù)組對(duì)象并將底層數(shù)組對(duì)象拷貝到一個(gè)新的數(shù)組對(duì)象中,將要添加的元素添加到新的數(shù)組對(duì)象中坪稽,最后調(diào)用setArray方法曼玩,將底層數(shù)組對(duì)象變量array引向新的數(shù)組對(duì)象。最后釋放鎖窒百。
  • iterator()方法
    iterator()方法其實(shí)是在內(nèi)部創(chuàng)建了一個(gè)COWIterator實(shí)例對(duì)象黍判,在該實(shí)例對(duì)象的內(nèi)部聲明一個(gè)數(shù)組的快照變量指向CopyOnWriteArrayList的底層數(shù)組。然后通過(guò)該變量進(jìn)行對(duì)數(shù)組元素的遍歷操作篙梢。與iterator()方法類(lèi)似的還有sublist()方法顷帖。
  • 其它方法
    CopyOnWriteArrayList的其它的更新操作基本與add()方法思想一直,都是先獲取鎖,在操作完成后將原有數(shù)組變量指向新的數(shù)組變量贬墩。最后在finally塊中釋放鎖榴嗅。

三、CopyOnWriteArrayList總結(jié)

CopyOnWriteArrayList的實(shí)現(xiàn)陶舞,可以看出包含了2個(gè)思想:讀寫(xiě)分離和最終一致性(因?yàn)椴l(fā)訪(fǎng)問(wèn)情況下嗽测,某個(gè)線(xiàn)程作了元素的更新操作后,array變量尚未指向新數(shù)組前肿孵,其它線(xiàn)程訪(fǎng)問(wèn)的可能還是原來(lái)的數(shù)組里的元素)唠粥。對(duì)于多線(xiàn)程情況下,遍歷訪(fǎng)問(wèn)操作遠(yuǎn)大于更新操作的時(shí)候停做,CopyOnWriteArrayList無(wú)疑是最好的選擇晤愧,省略了我們自己去加同步的操作。但是數(shù)組的拷貝是一項(xiàng)費(fèi)時(shí)費(fèi)資源的操作蛉腌,對(duì)于非多線(xiàn)程或數(shù)據(jù)變化較多的情況下官份,還是避免使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烙丛,一起剝皮案震驚了整個(gè)濱河市舅巷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜀变,老刑警劉巖悄谐,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異库北,居然都是意外死亡爬舰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)寒瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)情屹,“玉大人,你說(shuō)我怎么就攤上這事杂腰±悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵喂很,是天一觀的道長(zhǎng)惜颇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)少辣,這世上最難降的妖魔是什么凌摄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮漓帅,結(jié)果婚禮上锨亏,老公的妹妹穿的比我還像新娘痴怨。我一直安慰自己,他們只是感情好器予,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布浪藻。 她就那樣靜靜地躺著,像睡著了一般乾翔。 火紅的嫁衣襯著肌膚如雪爱葵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天反浓,我揣著相機(jī)與錄音钧惧,去河邊找鬼。 笑死勾习,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懈玻。 我是一名探鬼主播巧婶,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涂乌!你這毒婦竟也來(lái)了艺栈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤湾盒,失蹤者是張志新(化名)和其女友劉穎湿右,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罚勾,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅人,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尖殃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈莺。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖送丰,靈堂內(nèi)的尸體忽然破棺而出缔俄,到底是詐尸還是另有隱情,我是刑警寧澤器躏,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布俐载,位于F島的核電站,受9級(jí)特大地震影響登失,放射性物質(zhì)發(fā)生泄漏遏佣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一壁畸、第九天 我趴在偏房一處隱蔽的房頂上張望贼急。 院中可真熱鬧茅茂,春花似錦、人聲如沸太抓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)走敌。三九已至碴倾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掉丽,已是汗流浹背跌榔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捶障,地道東北人僧须。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像项炼,于是被迫代替她去往敵國(guó)和親担平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法锭部,類(lèi)相關(guān)的語(yǔ)法暂论,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法拌禾,異常的語(yǔ)法取胎,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,664評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit湃窍,java的開(kāi)發(fā)和運(yùn)行環(huán)境闻蛀,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,661評(píng)論 0 11
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司坝咐,掛了不少循榆,但最終還是拿到小米、百度墨坚、阿里秧饮、京東、新浪泽篮、CVTE盗尸、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,278評(píng)論 11 349
  • 今天中午幾個(gè)同事一起在食堂用餐,談到近期飲品類(lèi)加盟店“一點(diǎn)點(diǎn)”雨后春筍般鋪開(kāi)的現(xiàn)象帽撑。已有同事想集資開(kāi)一家店泼各。 集資...
    馬努塔閱讀 132評(píng)論 0 0
  • 文/小楠 “你真的在聽(tīng)我說(shuō)話(huà)嗎扣蜻?” 在我和老公吵架的時(shí)候逆巍,這是出現(xiàn)頻率最高的一句話(huà)。 有一天晚上吵到凌晨三點(diǎn)莽使,室友...
    個(gè)人成長(zhǎng)教練周育楠閱讀 1,186評(píng)論 0 1