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()

本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18648645

浙公网安备 33010602011771号