0.数据结构
数据结构两种存储结构:顺序存储和链式存储
- 顺序存储结构:ArrayList、Stack
- 链式存储结构:LinkedList、Queue
1.ArrayList 线程不安全
ArrayList是一个数组队列,相当于动态数组,java中的数组相比,它的容量能动态增长。线程不安全
特点:
- ArraysList中查找很快,插入较慢
- 操作是线程不安全的
替代ArrayList 线程安全的数组,3中方式
- Vector, 底层方法使用了synchronized关键字,效率较低,不推荐使用
- synchronizedList, List<String> list2=Collections.synchronizedList(list);
- CopyOnWriteArrayList, List<String> list=new CopyOnWriteArrayList<>();
2.CopyOnWriteArrayList
1.介绍
a.CopyOnWriteArrayList,写数据拷贝,读数据无锁,支持高效率并发读且是线程安全的。所有可变操作都是通过对底层数组进行一次新的复制来实现的。
b.适合使用读操作远远大于写操作的场景,比如缓存。不存在扩容的概念,每次写操作都是复制一个副本,在副本上进行修改,因为需要大面积的复制数组则写的效率比较低。
c.合适读多写少的场景,不过这类慎用 ,因为谁也没法保证CopyOnWriteArrayList 到底要放置多少数据,万一数据稍微有点多,每次add/set都要重新复制数组,这个代价实在太高昂了。在高性能的互联网应用中,这种操作分分钟引起故障
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
private E get(Object[] a, int index) {
return (E) a[index];
}