CopyOnWriteArraySet与CopyOnWriteArrayList

这两个集合都支持写复制,在并发性方面比,ArrayList,LinkList要好一些。
适用场景:读多邪少的情况

  看下源码为甚么读多写少的情况下比较好

第一步:

     
        CopyOnWriteArraySet copyOnWriteArraySet=new CopyOnWriteArraySet<>();
        
        copyOnWriteArraySet.add();

  第二步:

   public boolean add(E e) {
        return al.addIfAbsent(e);
    }

  第三步:

   public boolean addIfAbsent(E e) {
        Object[] snapshot = getArray();
        return indexOfRange(e, snapshot, 0, snapshot.length) < 0
            && addIfAbsent(e, snapshot);
    }

  第四步:

   private static int indexOfRange(Object o, Object[] es, int from, int to) {
        if (o == null) {
            for (int i = from; i < to; i++)
                if (es[i] == null)
                    return i;
        } else {
            for (int i = from; i < to; i++)
                if (o.equals(es[i]))
                    return i;
        }
        return -1;
    }

  第五步:

    private boolean addIfAbsent(E e, Object[] snapshot) {
        synchronized (lock) {
            Object[] current = getArray();
            int len = current.length;
            if (snapshot != current) {
                // Optimize for lost race to another addXXX operation
                int common = Math.min(snapshot.length, len);
                for (int i = 0; i < common; i++)
                    if (current[i] != snapshot[i]
                        && Objects.equals(e, current[i]))
                        return false;
                if (indexOfRange(e, current, common, len) >= 0)
                        return false;
            }
            Object[] newElements = Arrays.copyOf(current, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        }
    }

  

 现在知道为啥添加时多线程并发效率不高了吧,加了锁,每加一个元素都要把原来的赋值一份,并发与数据量大的时候就不好了。

 

接下来看看

CopyOnWriteArrayList copyOnWriteArrayList=new CopyOnWriteArrayList();
copyOnWriteArrayList.add()

 

posted @ 2025-01-02 19:41  余生请多指教ANT  阅读(12)  评论(0)    收藏  举报