91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是Copy-on-Write

發布時間:2021-12-28 13:50:03 來源:億速云 閱讀:197 作者:柒染 欄目:大數據

這篇文章給大家介紹什么是Copy-on-Write,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

簡介: Copy-on-Write 

所謂 Copy-on-Write,  很簡單,顧名思義,  就是“  寫數據的時候利用拷貝的副本來執行  ”。  
Java中中常用的就是CopyOnWriteArrayList和 CopyOnWriteArraySet 這兩個 Copy-on-Write 容器,它們背后的設計思想就是 Copy-on-Write;  通過 Copy-on-Write 這兩個容器實現的讀操作是無鎖的,由于無鎖,所以將讀操作的性能發揮到了極致

源碼分析:

我們一起看下CopyOnWriteArrayList源碼,首先看下add方法:

public boolean add(E e) {        final ReentrantLock lock = this.lock;        lock.lock();        try {            Object[] elements = getArray();            int len = elements.length;            Object[] newElements = Arrays.copyOf(elements, len + 1);            newElements[len] = e;            setArray(newElements);            return true;        } finally {            lock.unlock();        }    }
可以看到在add的時候首先通過cas獲取鎖,然后獲取原數組長度.

調用copyOf將原數組復制到新數組中且長度為原數組長度+1

然后調用setArray方法,也就是說修改的時候實際調用的是源數組的副本,那我們進一步跟進setArray方法
/**     * Sets the array.     */    final void setArray(Object[] a) {        array = a;    }

可以看到在這里直接將新數組復制給array; 那array是誰呢 敲黑板! 劃重點來了

private transient volatile Object[] array;

內部靜態變量,并且有volatile修飾,那么就可以用volatile寫的方式,把這個副本數組賦值給volatile修飾的那個數組的引用變量了。

只要一賦值給那個volatile修飾的變量,立馬就會對讀線程可見,大家都能看到最新的數組了。

難么在新增的同時有讀情求過來呢?會不會阻塞呢?我們接著看get方法:

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

根本不會堵塞或者不安全呢,因為修改的時候采用的是源數組的副本,十分簡單直接根據下標從內部靜態變量array中獲取

CopyOnWriteArrayList,就是用空間換時間,更新的時候基于副本更新,避免鎖,然后最后用volatile變量來賦值保證可見性,適用于讀多寫少的場景,所以還是要根據實際業務場景,判斷哪種適合。

關于什么是Copy-on-Write就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節
推薦閱讀:
  1. 什么是PHP
  2. 什么是python

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太和县| 新安县| 陆丰市| 且末县| 高阳县| 麻江县| 扬州市| 大埔区| 海口市| 柘荣县| 平邑县| 高雄市| 武义县| 清涧县| 镇宁| 行唐县| 东乌珠穆沁旗| 鄂伦春自治旗| 奎屯市| 翼城县| 铅山县| 华阴市| 彭州市| 迁安市| 龙川县| 锡林郭勒盟| 无为县| 昆明市| 江都市| 通城县| 宣汉县| 行唐县| 卢龙县| 伊吾县| 乐东| 武强县| 泉州市| 利川市| 鹤山市| 东源县| 平乐县|