Java 并發(fā)系列四:CopyOnWriteArrayList 實(shí)現(xiàn)原理及源碼分析【轉(zhuǎn)載】

When

CopyOnWriteArrayList 是jdk1.5以后并發(fā)包中提供的一種并發(fā)容器,寫(xiě)操作通過(guò)創(chuàng)建底層數(shù)組的新副本來(lái)實(shí)現(xiàn),是一種讀寫(xiě)分離的并發(fā)策略,我們也成為“寫(xiě)時(shí)復(fù)制容器”,類(lèi)似的容器還有 CopyOnWriteArraySet。

Why

眾所周知,集合框架中的ArrayList 是非線程安全的,Vector雖然是線程安全的,但是處理方式簡(jiǎn)單粗暴(synchronized),性能較差。而CopyOnWriteArrayList提供了不同的處理并發(fā)的思路。

How

很多時(shí)候,我們系統(tǒng)中處理的都是讀多寫(xiě)少的并發(fā)場(chǎng)景。CopyOnWriterArrayList 允許并發(fā)的讀,讀操作是無(wú)鎖的,性能較高。寫(xiě)操作的話,比如向容器增加一個(gè)元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫(xiě)操作,結(jié)束之后再將原容器的引用指向新容器。

img

優(yōu)缺點(diǎn)分析

了解了CopyOnWriteArrayList原理,接下來(lái)分析優(yōu)缺點(diǎn)及使用場(chǎng)景

優(yōu)點(diǎn):

讀操作性能很高,因?yàn)闊o(wú)需任何同步措施,比較適用于讀多寫(xiě)少的并發(fā)場(chǎng)景。Java 的 list 在遍歷時(shí),若中途有其他線程對(duì)容器進(jìn)行修改,則會(huì)拋出ConcurrentModificationException 異常。而CopyOnWriteArrayList由于其“讀寫(xiě)分離”的思想,遍歷和修改操作分別作用在不同的 list容器,所以迭代的時(shí)候不會(huì)拋出 ConcurrentModificationExecption 異常了。

缺點(diǎn):

缺點(diǎn)也很明顯,一是內(nèi)存占用問(wèn)題,畢竟每次執(zhí)行寫(xiě)操作都要將原容器拷貝一份,數(shù)據(jù)量大時(shí),對(duì)內(nèi)存壓力較大,甚至可能引起頻繁GC,二是無(wú)法保證實(shí)時(shí)性,Vector 對(duì)讀寫(xiě)操作均加鎖同步,可以保證容器的讀寫(xiě)強(qiáng)一致性,CopyOnWriteArrayList由于其實(shí)現(xiàn)策略的原因,寫(xiě)和讀分別作用于不容容器上,在寫(xiě)的過(guò)程中,讀是不會(huì)發(fā)生阻塞的,未切換索引置新容器時(shí),是讀不到剛寫(xiě)入的數(shù)據(jù)的。

源碼分析

原理理解了,再來(lái)分析源碼吧~~~~~

public boolean add(E e) {
   //加鎖,對(duì)寫(xiě)操作保證線程安全
   final ReentrantLock lock = this.lock;
   lock.lock();
   try {
       Object[] elements = getArray();
       int len = elements.length;
       //拷貝原容器,長(zhǎng)度為原容器+1
       Object[] newElements = Arrays.copyOf(elements, len + 1);
       //在新副本執(zhí)行添加操作
       newElements[len] = e;
       //底層數(shù)組指向新的數(shù)組
       setArray(newElements);
       return true;
   } finally {
       lock.unlock();
   }
}
其中 底層數(shù)組定義如下:
private transient volatile Object[] array;
增加內(nèi)存可見(jiàn)性。

同理可以分析刪除操作。

總結(jié)

其實(shí)并發(fā)容器的優(yōu)缺點(diǎn),是要根據(jù)我們實(shí)際的業(yè)務(wù)場(chǎng)景做出取舍的。

但前提是,你要了解他們各自的優(yōu)缺點(diǎn),謝謝!

再一次感謝作者?。?/h4>

https://www.cnblogs.com/chengxiao/p/6881974.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容