通过5个参数,去添加数据到cow中
package org.example.testDiv;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
public class Main2 {
public static CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
public static void f(int a, int b, int c, int d, int e) {
list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e);
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
f(1, 2, 3, 4, 5);
}).start();
}
TimeUnit.SECONDS.sleep(2);
System.out.println(list);
System.out.println(list.size());
}
}
/*
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
50
*/
源码分析:
add方法
public boolean add(E e) {
synchronized (lock) {
Object[] es = getArray();
int len = es.length;
es = Arrays.copyOf(es, len + 1);
es[len] = e;
setArray(es);
return true;
}
}
get
public E get(int index) {
return elementAt(getArray(), index);
}
可以看出来,get方法是不加锁的,这样子再高并发下,读多写少时,可以减少很多的锁竞争。
一些思考:
int index = list.size();
list.remove(index);
这样子我想有可能会抛出异常,也许在业务中不会出现这类代码?