一、Vector和ArrayList、LinkedList联系和区别,分别的使用场景
ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢
LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快
Vector: 底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁
使用场景:
- Vector已经很少用了
- 增加和删除场景多则用LinkedList
- 查询和修改多则用ArrayList
二、如果需要保证线程安全,ArrayList应该怎么做,有几种方式
方式一:使用Collections.synchronizedList(
synchronized加锁)
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
方式二:使用 CopyOnWriteArrayList(
ReentrantLock加锁)
List<String> cowList = new CopyOnWriteArrayList<>();
三、CopyOnWriteArrayList和 Collections.synchronizedList实现线程安全的区别以及它们的使用场景
CopyOnWriteArrayList:执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove等),在执行完修改后将原来集合指向新的集合来完成修改操作,源码里面用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组
使用场景:读高性能,适用读操作,读操作远远大于写操作的场景中使用(因为读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的, 读多写少)
Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步锁
使用场景:读操作性能并不如CopyOnWriteArrayList(因为读操作的时候有加锁)
四、CopyOnWriteArrayList的设计思想以及它有什么缺点
设计思想:读写分离+最终一致,读的时候是读旧的数组
缺点:内存占用问题,写时复制机制,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC