CopyOnWriteArrayList 介绍
ArrayList是线程非安全的,而Vector或者是使用 Collections,
可以将 ArrayList 包装成一个线程安全的类。
不过这两种方法也有很大的缺点,那就是他们使用的都是独占锁,
独占式锁在同一时刻只有一个线程能够获取,效率太低。于是CopyOnWriteArrayList 应用而生了。
独占锁效率低:采用读写分离思想解决。
读操作不加锁,所有线程都不会阻塞。写操作加锁,线程会阻塞
写线程获取到锁,其他线程包括读线程阻塞,这咋办呢?
当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,
复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。
CopyOnWriteArrayList并非一定线程安全
数组角标越界问题
https://www.jianshu.com/p/fc0ee3aaf2df
比如一个线程向容器中添加元素,一个线程来读取元素,此时有第三个线程进行删除元素操作,
读线程去读取容器中最后一个元素,读之前的时候容器大小为i,
当去读的时候删除线程突然删除了一个元素,这个时候容器大小变为了i-1,
读线程仍然去读取第i个元素,这时候就会发生数组越界。