<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【多線程】JUC版的CopyOnWriteArrayList

      CopyOnWriteArrayList

      • CopyOnWriteArrayList適合于多線程場景下使用,其采用讀寫分離的思想,讀操作不上鎖,寫操作上鎖,且寫操作效率較低。
      • CopyOnWriteArrayList基于fail-safe機制,每次修改都會在原先基礎上復制一份,修改完畢后在進行替換
      • CopyOnWriteArrayList采用的是ReentrantLock進行上鎖。
      • CopyOnWriteArrayList和ArrayList一樣,其底層數據結構也是數組,加上transient不讓其被序列化,加上volatile修飾來保證多線程下的其可見性和有序性。
      • CopyOnWriteArrayList效率比ArrayList低不少,畢竟多線程場景下,其每次都是要在原數組基礎上復制一份在操作耗內存和時間,而ArrayList只是容量滿了進行擴容,因此在非多線程的場景下還是用ArrayList吧。

      構造函數

      public CopyOnWriteArrayList() {
          //默認創建一個大小為0的數組
          setArray(new Object[0]);
      }
      
      final void setArray(Object[] a) {
          array = a;
      }
      
      public CopyOnWriteArrayList(Collection<? extends E> c) {
          Object[] elements;
          //如果當前集合是CopyOnWriteArrayList的類型的話,直接賦值給它
          if (c.getClass() == CopyOnWriteArrayList.class)
              elements = ((CopyOnWriteArrayList<?>)c).getArray();
          else {
              //否則調用toArra()將其轉為數組   
              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));
      }
      

      讀取方法(未加鎖

      final Object[] getArray() {
          return array;
      }
      public int size() {
          return getArray().length;
      }
      public boolean isEmpty() {
          return size() == 0;
      }
      public int indexOf(E e, int index) {
          Object[] elements = getArray();
          return indexOf(e, elements, index, elements.length);
      }
      public int lastIndexOf(Object o) {
          Object[] elements = getArray();
          return lastIndexOf(o, elements, elements.length - 1);
      }
      
      ........
      

      add方法(使用ReentrantLock加鎖

      public boolean add(E e) {
          //使用ReentrantLock上鎖
          final ReentrantLock lock = this.lock;
          lock.lock();
          try {
              //調用getArray()獲取原來的數組
              Object[] elements = getArray();
              int len = elements.length;
              //復制老數組,得到一個長度+1的數組
              Object[] newElements = Arrays.copyOf(elements, len + 1);
              //添加元素,在用setArray()函數替換原數組
              newElements[len] = e;
              setArray(newElements);
              return true;
          } finally {
              lock.unlock();
          }
      }
      

      可見其修改操作是基于fail-safe機制,像我們的String一樣,不在原來的對象上直接進行操作,而是復制一份對其進行修改,另外此處的修改操作是利用Lock鎖進行上鎖的,所以保證了線程安全問題。

      remove方法(使用ReentrantLock加鎖

      public boolean remove(Object o) {
          Object[] snapshot = getArray();
          int index = indexOf(o, snapshot, 0, snapshot.length);
          return (index < 0) ? false : remove(o, snapshot, index);
      }
      
      private boolean remove(Object o, Object[] snapshot, int index) {
          final ReentrantLock lock = this.lock;
          //上鎖
          lock.lock();
          try {
              Object[] current = getArray();
              int len = current.length;
              if (snapshot != current) findIndex: {
                  int prefix = Math.min(index, len);
                  for (int i = 0; i < prefix; i++) {
                      if (current[i] != snapshot[i] && eq(o, current[i])) {
                          index = i;
                          break findIndex;
                      }
                  }
                  if (index >= len)
                      return false;
                  if (current[index] == o)
                      break findIndex;
                  index = indexOf(o, current, index, len);
                  if (index < 0)
                      return false;
              }
              //復制一個數組
              Object[] newElements = new Object[len - 1];
              System.arraycopy(current, 0, newElements, 0, index);
              System.arraycopy(current, index + 1,
                               newElements, index,
                               len - index - 1);
              //替換原數組
              setArray(newElements);
              return true;
          } finally {
              lock.unlock();
          }
      }
      

      思路與add方法一致。

      posted @ 2022-04-01 00:06  HZX↑  閱讀(65)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲av色精品一区二区| 亚洲精品成人一二三专区| 久久精品女人天堂av免费观看| 亚洲日韩久热中文字幕| 日本三级成本人网站| 亚洲综合伊人久久大杳蕉| 亚洲av色在线播放一区| 幻女free性俄罗斯毛片| 亚洲AVAV天堂AV在线网阿V| 无码h黄肉动漫在线观看| 精品国产免费一区二区三区香蕉| 18av千部影片| 欧美裸体xxxx极品| 国产一区二区在线观看的| 国产叼嘿视频一区二区三区| 国内精品一区二区不卡| 国产综合久久久久久鬼色| 国产999久久高清免费观看| 最近免费中文字幕大全免费版视频| 一区三区在线专区在线| 97成人碰碰久久人人超级碰oo| 久久天天躁狠狠躁夜夜躁| 中文字幕亚洲综合第一页| 亚洲永久精品日韩成人av| 成人精品视频一区二区三区| 午夜爽爽爽男女免费观看影院| 青草热在线观看精品视频| 国产亚洲精品成人无码精品网站| 国产精品中文字幕自拍| 久久99精品久久久久久青青| 真实国产老熟女无套中出| 莱阳市| 国产极品粉嫩尤物一区二区| 欧美牲交a欧美牲交aⅴ图片| 人妻夜夜添夜夜无码av| 高清中文字幕国产精品| 亚洲国产超清无码专区| 性xxxx视频播放免费| 26uuu另类亚洲欧美日本| 亚洲精品一区二区口爆| 人人色在线视频播放|