您好,登錄后才能下訂單哦!
這篇文章給大家介紹什么是Copy-on-Write,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
我們一起看下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(); } }
/** * Sets the array. */ final void setArray(Object[] a) { array = a; }
可以看到在這里直接將新數(shù)組復(fù)制給array; 那array是誰呢 敲黑板! 劃重點來了
private transient volatile Object[] array;
內(nèi)部靜態(tài)變量,并且有volatile修飾,那么就可以用volatile寫的方式,把這個副本數(shù)組賦值給volatile修飾的那個數(shù)組的引用變量了。
只要一賦值給那個volatile修飾的變量,立馬就會對讀線程可見,大家都能看到最新的數(shù)組了。
難么在新增的同時有讀情求過來呢?會不會阻塞呢?我們接著看get方法:
public E get(int index) {
return get(getArray(), index);
}
final Object[] getArray() {
return array;
}
根本不會堵塞或者不安全呢,因為修改的時候采用的是源數(shù)組的副本,十分簡單直接根據(jù)下標(biāo)從內(nèi)部靜態(tài)變量array中獲取
關(guān)于什么是Copy-on-Write就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。