日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CopyOnWriteArrayList源码分析

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CopyOnWriteArrayList源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于jdk1.7源碼

一、無鎖容器

CopyOnWriteArrayList是JDK5中添加的新的容器,除此之外,還有CopyOnWriteArraySet、ConcurrentHahshMap和ConcurrentLinkedQueue等,它們都是無鎖容器。

所謂無鎖,就是不需要使用對象內置鎖(synchronized)或顯示加鎖(Lock),而是拋棄鎖機制而使用其它一些策略來保證線程安全。

這些無鎖容器背后的通用策略是:對容器的修改可以與讀取操作同時發生,只要讀取者只能看完成修改的結果即可。修改是在容器數據結構的某個部分的一個單獨的副本(有時是整個數據結構的副本)上執行的,并且這個副本在修改過程中是不可視的。只有當修改完成時,被修改的結構才會自動地與主數據結構進行交換,之后讀取者就可以看到這個修改了。

——from《java編程思想》p755

?

二、源碼分析

類聲明

public class CopyOnWriteArrayList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

屬性

/** The lock protecting all mutators *//** 重入鎖*/transient final ReentrantLock lock = new ReentrantLock();/** The array, accessed only via getArray/setArray. *//** 數組,只能通過getArray/setArray訪問*/private volatile transient Object[] array;

構造器

/*** 構造器(構造一個空的數組)*/public CopyOnWriteArrayList() {setArray(new Object[0]);}/*** 構造器(使用指定的容器來創建,按照原容器中元素的順序)。*/public CopyOnWriteArrayList(Collection<? extends E> c) {Object[] elements = c.toArray();// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elements.getClass() != Object[].class)elements = Arrays.copyOf(elements, elements.length, Object[].class);setArray(elements);}/*** 構造器(創建給定數組的拷貝)*/public CopyOnWriteArrayList(E[] toCopyIn) {setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class));}

CopyOnWriteArrayList在創建時,并沒有默認容量,這點跟ArrayList不同。

?

get方法

public E get(int index) {return get(getArray(), index);}final Object[] getArray() {return array;}

讀操作沒有進行同步,因為CopyOnWriteArrayList的讀和寫分離。

add方法

public boolean add(E e) {final ReentrantLock lock = this.lock;//使用重入鎖加鎖 lock.lock();try {//現有數組Object[] elements = getArray();int len = elements.length;//創建新數組,并擴容1,用現有數組元素來填充(末尾為空)Object[] newElements = Arrays.copyOf(elements, len + 1);//將當前元素添加到數組尾部(在新數組上操作)newElements[len] = e;setArray(newElements);return true;} finally {//釋放鎖 lock.unlock();}}

remove方法

public boolean remove(Object o) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;if (len != 0) {// Copy while searching for element to remove// This wins in the normal case of element being presentint newlen = len - 1;//新數組長度比原來少1//構建新數組Object[] newElements = new Object[newlen];//遍歷查找現有數組【不包含末位元素】for (int i = 0; i < newlen; ++i) {//若存在if (eq(o, elements[i])) {// found one; copy remaining and exit//將待刪除元素o的后續所有元素拷貝到新數組中【拷貝o后面所有元素】for (int k = i + 1; k < len; ++k)newElements[k-1] = elements[k];setArray(newElements);return true;} else//當前不是要找的目標元素o,順便將元素拷貝到新數組中【多次循環累計的這個操作相當于拷貝目標元素之前位置的所有元素】//【由此說明,即使不存在目標元素,依然要做拷貝現有數組的操作】newElements[i] = elements[i];}// special handling for last cell//【末位元素單獨處理】//如果末位元素是目標元素。此時,該拷貝的元素都已拷貝到新數組中,直接setArray(newElements)if (eq(o, elements[newlen])) {setArray(newElements);return true;}//如果末位元素仍然不是目標元素,說明不存在目標元素。//因為沒有setArray(newElements),所以原數組依舊是原數組。 }//現有元素數組為空,直接返回falsereturn false;} finally {lock.unlock();}}

迭代器

public Iterator<E> iterator() {return new COWIterator<E>(getArray(), 0);}private static class COWIterator<E> implements ListIterator<E> {//快照數組private final Object[] snapshot;private int cursor;private COWIterator(Object[] elements, int initialCursor) {cursor = initialCursor;// snapshot = elements;}public boolean hasNext() {return cursor < snapshot.length;}public boolean hasPrevious() {return cursor > 0;}@SuppressWarnings("unchecked")public E next() {if (! hasNext())throw new NoSuchElementException();// return (E) snapshot[cursor++];}@SuppressWarnings("unchecked")public E previous() {if (! hasPrevious())throw new NoSuchElementException();// return (E) snapshot[--cursor];}public int nextIndex() {return cursor;}public int previousIndex() {return cursor-1;}/*** 迭代器不支持remove/set/add方法。*/public void remove() {throw new UnsupportedOperationException();}public void set(E e) {throw new UnsupportedOperationException();}public void add(E e) {throw new UnsupportedOperationException();}}

?

?

總結

1.CopyOnWriteArrayList的工作原理?

CopyOnWriteArrayList在做修改操作時,每次都是重新創建一個新的數組,在新數組上操作,最終再將新數組替換掉原數組。因此,在做修改操作時,仍可以做讀取操作,讀取直接操作的原數組。讀和寫操作的目標都不同,因此讀操作和寫操作互不干擾,只有寫與寫之間需要進行同步等待。另外,原數組被聲明為volatile,這就保證了,一旦數組發生變化,則結果對其它線程(讀線程和其它寫線程)是可見的。

2.CopyOnWriteArrayList適合的應用場景?

正是由于每次修改都會創建新數組,內存中都要同時存有原數組和新數組,同時也要將元素拷貝到新數組中,內存開銷大,所以CopyOnWriteArrayList只適合于讀多寫少的場景。

比如某些系統級別的信息,往往只是需要加載或者修改很少的次數,但是會被系統內所有模塊頻繁的訪問,對于這種場景,我們最希望看到的就是讀操作盡可能地快,而寫即使慢一些也沒太大關系。

3.CopyOnWriteArrayList能否像ArrayList一樣支持fail-fast?

CopyOnWriteArrayList并不支持fail-fast機制,請參考CopyOnWriteArrayList不支持fail-fast機制。所以它的好處之一是當多個迭代器同時遍歷和修改這個列表時,不會拋出ConcurrentModificationException,因此也不必編寫特殊的代碼去防范這種異常。

4.CopyOnWriteArrayList的擴容?

CopyOnWriteArrayList并不像ArrayList一樣指定默認的初始容量。它也沒有自動擴容的機制,而是添加幾個元素,長度就相應的增長多少。

①因為CopyOnWriteArrayList適用于讀多寫少,既然是寫的情況少,則不需要頻繁擴容。

②修改操作每次在生成新的數組時就指定了新的容量,也就相當于擴容了,所以不需要額外的機制來實現擴容。

轉載于:https://www.cnblogs.com/rouqinglangzi/p/10115658.html

總結

以上是生活随笔為你收集整理的CopyOnWriteArrayList源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品www. | 屁屁影院第一页 | 爱搞逼综合网 | 国产精品美女一区 | 国产调教一区 | 激情四射网 | 国产91高清 | 激情伊人五月天 | 亚洲第一av | 免费看的一级片 | 国产黄色的视频 | 直接看的av网站 | 久久精品视频2 | 99视频+国产日韩欧美 | 四虎在线看片 | av在线资源观看 | 中文字幕精品一区 | 九色porny蝌蚪视频 | 国产麻豆一精品一av一免费 | 欧美第三页 | 亚洲一区二区网站 | 国产婷婷色一区二区三区 | 亚洲视频一区二区在线观看 | aa片在线观看视频在线播放 | 制服丝袜在线播放 | 成人毛片观看 | 在线观看欧美亚洲 | 色无五月 | 亚洲av乱码久久精品蜜桃 | 日韩国产电影 | 亚洲免费中文 | 激情二区 | 国产精品国产三级国产传播 | 日韩一本在线 | 秋霞成人av| 久草播放 | 成人污视频 | 成人小视频免费 | 国产欧美一区二区在线观看 | 中文字幕一区二区在线播放 | 北条麻妃一区二区三区免费 | 日韩av黄色片 | 中文字幕在线视频一区 | 亚洲va国产va天堂va久久 | 2023av在线| 夜夜嗨av一区二区三区网页 | 一道本无吗一区 | 午夜亚洲精品 | 永久av在线免费观看 | 久久91 | 午夜伦理视频 | 亚洲精品中文字幕 | 精品第一页 | 91国偷自产一区二区三区老熟女 | 中文字幕一区二区三区手机版 | 都市激情 自拍偷拍 | 轻轻草在线视频 | 粉嫩av四季av绯色av | 五月婷婷操 | 疯狂撞击丝袜人妻 | 国产av人人夜夜澡人人爽麻豆 | 三级国产网站 | 永久免费av无码网站性色av | av导航在线观看 | 少妇性色av | 蜜桃网站 | 国精产品99永久一区一区 | 熟妇五十路六十路息与子 | 日韩一级片中文字幕 | 久久精品99北条麻妃 | 亚洲AV无码久久精品色三人行 | 国产成人精品一区二三区 | 中文日韩字幕 | 国产精品毛片一区二区在线看舒淇 | 综合激情久久 | 中文字幕视频 | 日本www高清视频 | 日本不卡三区 | 亚洲国产精彩视频 | 色图自拍偷拍 | 国产免费一区二区三区网站免费 | 国产极品免费 | 美足av | 精品视频免费看 | 亚洲一区免费观看 | jizz美女| 亚洲黄色一区 | 爱草在线视频 | 日韩精品导航 | 国产欧美日本在线 | 激情小说专区 | 91亚洲在线 | 黑白配在线观看免费观看 | 欧美日本国产在线 | 日韩视频一二三区 | 亚洲精品国产成人av在线 | 性高湖久久久久久久久aaaaa | 97福利在线 | 少妇被躁爽到高潮 |