现在开始做准备,年底再出发,每天努力一点,每天就离目标更近一点,加油,89老少年!
直接从源码开始认识 CopyOnWriteArrayList,它是线程安全的,从 jdk1.5开始就有了。
public class CopyOnWriteArrayList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
CopyOnWriteArrayList 的实现接口没有 ArrayList 那么复杂,看下每个接口的作用
RandomAccess:标记类接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。底层是数组,就鼓励使用随机下标访问,提升遍历性能,如果是链表,使用 Iterator,效率会更高。看下Collections的binarySearch方法,会对 List 进行 instanceof 判断,然后采取最优解进行遍历搜索。
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
if (c==null)
return binarySearch((List<? extends Comparable<? super T>>) list, key);
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key, c);
else
return Collections.iteratorBinarySearch(list, key, c);
}
刚才说 CopyOnWriteArrayList 是线程安全的,它是怎么实现线程安全的呢?先上一个简图,读无锁,其余只要改变 list 内容都使用到了 ReentrantLock,下面具体分析下它的原理。
关联面试题:CopyOnWriteArrayList是线程安全的吗?怎么实现线程安全的?为什么读不需要加锁,添加需要加锁,什么机制?
。。。。未完待续