淺談CopyOnWriteArraySet

weixin_34249678發表於2017-10-23
CopyOnWriteArraySet結構圖
2765719-c87e81b10c87c13c.png
CopyOnWriteArraySet.png
CopyOnWriteArraySet主要方法
  • public boolean add(E e);
  • public boolean remove(Object o);
CopyOnWriteArraySet解讀主要方法

來看一下public boolean add(E e)原始碼

 public boolean add(E e) {
        //這個al就是CopyOnWriteArrayList也就是說CopyOnWriteArraySet內部是用CopyOnWriteArrayList來實現的
        return al.addIfAbsent(e);
    }
//這段程式碼也很好理解就是首先檢查原來的陣列裡面有沒有要新增的元素,如果有的話就不要再新增了,如果沒有的話,建立一個新的陣列,複製之前陣列元素並且新增新的元素
public boolean addIfAbsent(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            // Copy while checking if already present.
            // This wins in the most common case where it is not present
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = new Object[len + 1];
            for (int i = 0; i < len; ++i) {
                if (eq(e, elements[i]))
                    return false; // exit, throwing away copy
                else
                    newElements[i] = elements[i];
            }
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }

來看一下 public boolean remove(Object o)原始碼

  public boolean remove(Object o){
        return al.remove(o);
    }
//呼叫CopyOnWriteArrayList的刪除
CopyOnWriteArraySet遍歷介紹

常用的遍歷方式:

       //one  foreach  遍歷
        for (Object o : list) {
            System.out.println(o);
        }
        //two 迭代器的遍歷
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
CopyOnWriteArraySet其他特性介紹
  • 首先,說明一下CopyOnWriteArraySet的資料結構是什麼?其實它的結構嚴格意義來說是一個集合,它的底層實現是利用陣列,它的上層實現是CopyOnWriteArrayList。
  • 其次,CopyOnWriteArraySet是一個集合,所以它是不可以放置重複的元素的,它的取重邏輯是在add中體現的。
  • 最後,CopyOnWriteArraySet是利用CopyOnWriteArrayList來實現的,因為CopyOnWriteArrayList是執行緒安全的,所以CopyOnWriteArraySet操作也是執行緒安全的。