一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|

服務(wù)器之家 - 編程語言 - JAVA教程 - java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼分析

java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼分析

2020-10-23 20:45dreamcatcher-cx JAVA教程

這篇文章主要為大家詳細(xì)介紹了java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

CopyOnWriteArrayList是Java并發(fā)包中提供的一個(gè)并發(fā)容器,它是個(gè)線程安全且讀操作無鎖的ArrayList,寫操作則通過創(chuàng)建底層數(shù)組的新副本來實(shí)現(xiàn),是一種讀寫分離的并發(fā)策略,我們也可以稱這種容器為"寫時(shí)復(fù)制器",Java并發(fā)包中類似的容器還有CopyOnWriteSet。本文會(huì)對(duì)CopyOnWriteArrayList的實(shí)現(xiàn)原理及源碼進(jìn)行分析。

實(shí)現(xiàn)原理

  我們都知道,集合框架中的ArrayList是非線程安全的,Vector雖是線程安全的,但由于簡單粗暴的鎖同步機(jī)制,性能較差。而CopyOnWriteArrayList則提供了另一種不同的并發(fā)處理策略(當(dāng)然是針對(duì)特定的并發(fā)場景)。

  很多時(shí)候,我們的系統(tǒng)應(yīng)對(duì)的都是讀多寫少的并發(fā)場景。CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個(gè)元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫操作,結(jié)束之后再將原容器的引用指向新容器。

java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼分析

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

  了解了CopyOnWriteArrayList的實(shí)現(xiàn)原理,分析它的優(yōu)缺點(diǎn)及使用場景就很容易了。

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

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

  缺點(diǎn):

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

源碼分析

  基本原理了解了,CopyOnWriteArrayList的代碼實(shí)現(xiàn)看起來就很容易理解了。

java" id="highlighter_301530">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public boolean add(E e) {
  //ReentrantLock加鎖,保證線程安全
  final ReentrantLock lock = this.lock;
  lock.lock();
  try {
   Object[] elements = getArray();
   int len = elements.length;
   //拷貝原容器,長度為原容器長度加一
   Object[] newElements = Arrays.copyOf(elements, len + 1);
   //在新副本上執(zhí)行添加操作
   newElements[len] = e;
   //將原容器引用指向新副本
   setArray(newElements);
   return true;
  } finally {
   //解鎖
   lock.unlock();
  }
 }

  添加的邏輯很簡單,先將原容器copy一份,然后在新副本上執(zhí)行寫操作,之后再切換引用。當(dāng)然此過程是要加鎖的。

  刪除操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public E remove(int index) {
  //加鎖
  final ReentrantLock lock = this.lock;
  lock.lock();
  try {
   Object[] elements = getArray();
   int len = elements.length;
   E oldValue = get(elements, index);
   int numMoved = len - index - 1;
   if (numMoved == 0)
    //如果要?jiǎng)h除的是列表末端數(shù)據(jù),拷貝前l(fā)en-1個(gè)數(shù)據(jù)到新副本上,再切換引用
    setArray(Arrays.copyOf(elements, len - 1));
   else {
    //否則,將除要?jiǎng)h除元素之外的其他元素拷貝到新副本中,并切換引用
    Object[] newElements = new Object[len - 1];
    System.arraycopy(elements, 0, newElements, 0, index);
    System.arraycopy(elements, index + 1, newElements, index,
         numMoved);
    setArray(newElements);
   }
   return oldValue;
  } finally {
   //解鎖
   lock.unlock();
  }
 }

  刪除操作同理,將除要?jiǎng)h除元素之外的其他元素拷貝到新副本中,然后切換引用,將原容器引用指向新副本。同屬寫操作,需要加鎖。

  我們?cè)賮砜纯醋x操作,CopyOnWriteArrayList的讀操作是不用加鎖的,性能很高。

?
1
2
3
4
5
6
7
8
public E get(int index) {
  return get(getArray(), index);
 }
  直接讀取即可,無需加鎖
 
 private E get(Object[] a, int index) {
  return (E) a[index];
 }

 總結(jié)

  本文對(duì)CopyOnWriteArrayList的實(shí)現(xiàn)原理和源碼進(jìn)行了分析,并對(duì)CopyOnWriteArrayList的優(yōu)缺點(diǎn)也進(jìn)行了分析(Java并發(fā)包中還提供了CopyOnWriteSet,原理類似)。其實(shí)所謂并發(fā)容器的優(yōu)缺點(diǎn),無非是取決于我們?cè)诿鎸?duì)特定并發(fā)場景時(shí),是否能做出相對(duì)合理的選擇和應(yīng)用。也希望本文能幫助到有需要的童鞋,共勉。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/chengxiao/p/6881974.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎884aa永久播放地址http | 九九99热久久精品在线6 | 日比免费视频 | 紧身牛仔裤美女被啪啪久久网 | 四虎1515hh.com | 亚洲激情婷婷 | 国模娜娜一区二区三区 | 免费日批视频 | 欧美黑人一级 | 国产精品1024永久免费视频 | 69日本xxxhd | juliaann厨房大战 | av72成人 | 亚洲色域网| 国产女同精品 | 国产精品不卡高清在线观看 | 动漫美女被羞羞产奶 | 国色天香高清版 | xxxxxx性受 | 涩涩成人| 免费网站视频 | 成人久久伊人精品伊人 | 赤坂丽女医bd无删减在线观看 | 99久久精品久久久久久清纯 | 日韩欧美在线观看综合网另类 | 国产欧美一区视频在线观看 | 国产乱子伦一区二区三区 | 日韩r| 91尤物在线 | 思思91精品国产综合在线 | 52zfl宅福利yxpjw| 深夜在线 | 成人观看免费观看视频 | 欧美色图亚洲天堂 | 双性少爷受糙汉攻h | 亚洲精品免费在线观看 | jk制服白丝超短裙流白浆 | 人人人人人看碰人人免费 | yellow视频免费观看播放 | 我与么公激情性完整视频 | haodiaose在线精品免费观看 |