CopyOnWriteArrayList 读取和写入源码简单分析(java.util.concurrent包下)
1. CopyOnWriteArrayList 读取操作的实现
读取操作没有任何同步控制和锁操作,理由就是内部数组 array 不会发生修改,只会被另外一个 array 替换,因此可以保证数据安全.
2. CopyOnWriteArrayList 写入操作的实现
CopyOnWriteArrayList 写入操作 add() 方法在添加集合的时候 加了锁,保证同步, 避免多线程写的时候会 copy 出多个副本.
例子:
import java.util.concurrent.CopyOnWriteArrayList;
//JUC并发编程扩充
public class JUC {
public static void main(String[] args) throws InterruptedException {
CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList();
for (int i = 1; i <= 1000; i++) {
new Thread(()->{list.add(Thread.currentThread().getName());}).start();
}
Thread.sleep(1000);
System.out.println(list.size());
}
}
从输出结果看,CopyOnWriteArrayList集合是线程安全的集合,不需要同步.
查看源码:
可见该类自身已经有显性定义了锁,所以这个集合类是线程安全的集合.