1.ArraryList,Vector,LinkedList的区别和关系
- 三者都是List的接口的常用子类
- ArraryList,Vector是基于数组实现的;LinkedList是基于链表实现的
- ArraryList采用懒加载策略,扩容为原先数组的1.5倍,采用异步处理,线程不安全,性能较高;在频繁查找或者需要在尾部插入或者删除的时候使用
- Vector当产生对象时就初始化内部数组(默认大小为10),扩容为原来的2倍,采用sychronized同步方法,线程安全,性能很低(读读互斥)
- LinkedList采用异步处理,线程不安全,频繁在任意位置进行元素插入或者删除使用LinkedList
2.fail-fast与fail-safe
- fail-fast快速失败策略
是java集合(Collection)中的一种错误检测机制,当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出ConcurrentModificationException异常。fail-fast机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测bug。
优先考虑出现异常的情况,当异常产生的时,抛出异常,程序终止
public class Main{
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
for(int i = 0; i < 20; i++){
linkedList.add(i + ",");
}
Iterator<String> iterator = linkedList.iterator();
int i = 0;
while (iterator.hasNext()){
if(i == 7){
linkedList.remove(7);
}
System.out.print(iterator.next());
i++;
}
}
}
//以下是idea中抛出的异常
Exception in thread "main" java.util.ConcurrentModificationException
0,1,2,3,4,5,6,
- 如何产生?
modCount!=expectedModCount
modCount记录当前集合修改(结构化修改)的次数
expectedModCount记录获取集合迭代器时当前集合的修改次数
当遍历的时候修改集合的内容两者的值会不相等,因此会抛出异常
ConcurrentModificationException作用:避免多线程场景下数据脏读问题
- ail-fast如何解决?
遍历不要修改集合内容
使用迭代器内部的删除方法
使用fail-safe集合
fail-fast集合:java.util除了TreeMap以外的所有集合
juc包的集合(ConcurrentHashMap、CopyOnWriteArrayList)都属于fail-safe