真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是Copy-on-Write

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

創(chuàng)新互聯(lián)公司專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、彭州網(wǎng)絡(luò)推廣、微信小程序定制開(kāi)發(fā)、彭州網(wǎng)絡(luò)營(yíng)銷(xiāo)、彭州企業(yè)策劃、彭州品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供彭州建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

簡(jiǎn)介: Copy-on-Write 

所謂 Copy-on-Write,  很簡(jiǎn)單,顧名思義,  就是“  寫(xiě)數(shù)據(jù)的時(shí)候利用拷貝的副本來(lái)執(zhí)行  ”。  
Java中中常用的就是CopyOnWriteArrayList和 CopyOnWriteArraySet 這兩個(gè) Copy-on-Write 容器,它們背后的設(shè)計(jì)思想就是 Copy-on-Write;  通過(guò) Copy-on-Write 這兩個(gè)容器實(shí)現(xiàn)的讀操作是無(wú)鎖的,由于無(wú)鎖,所以將讀操作的性能發(fā)揮到了極致

源碼分析:

我們一起看下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的時(shí)候首先通過(guò)cas獲取鎖,然后獲取原數(shù)組長(zhǎng)度.

調(diào)用copyOf將原數(shù)組復(fù)制到新數(shù)組中且長(zhǎng)度為原數(shù)組長(zhǎng)度+1

然后調(diào)用setArray方法,也就是說(shuō)修改的時(shí)候?qū)嶋H調(diào)用的是源數(shù)組的副本,那我們進(jìn)一步跟進(jìn)setArray方法
/**     * Sets the array.     */    final void setArray(Object[] a) {        array = a;    }

可以看到在這里直接將新數(shù)組復(fù)制給array; 那array是誰(shuí)呢 敲黑板! 劃重點(diǎn)來(lái)了

private transient volatile Object[] array;

內(nèi)部靜態(tài)變量,并且有volatile修飾,那么就可以用volatile寫(xiě)的方式,把這個(gè)副本數(shù)組賦值給volatile修飾的那個(gè)數(shù)組的引用變量了。

只要一賦值給那個(gè)volatile修飾的變量,立馬就會(huì)對(duì)讀線程可見(jiàn),大家都能看到最新的數(shù)組了。

難么在新增的同時(shí)有讀情求過(guò)來(lái)呢?會(huì)不會(huì)阻塞呢?我們接著看get方法:

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

根本不會(huì)堵塞或者不安全呢,因?yàn)樾薷牡臅r(shí)候采用的是源數(shù)組的副本,十分簡(jiǎn)單直接根據(jù)下標(biāo)從內(nèi)部靜態(tài)變量array中獲取

CopyOnWriteArrayList,就是用空間換時(shí)間,更新的時(shí)候基于副本更新,避免鎖,然后最后用volatile變量來(lái)賦值保證可見(jiàn)性,適用于讀多寫(xiě)少的場(chǎng)景,所以還是要根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景,判斷哪種適合。

關(guān)于什么是Copy-on-Write就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)站題目:什么是Copy-on-Write
本文鏈接:http://weahome.cn/article/gdioph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部