ArrayList和Vector都是以数组实现的列表容器。
区别:
- ArrayList是懒加载,第一次添加元素时才进行初始化数组,Vector实例化时就初始化一个大小为10的数组。
- Vector的方法都是同步的,ArrayList方法并非线程安全。
- Vector扩容为2倍,ArrayList扩容1.5倍。
并发下的List
Java可以使用的并发List有Collection.synchronizedList, Vector, CopyOnWriteList。
CopyOnWriteList适合读多写少的并发场景。
*为什么Java不提供并发的list容器呢?
难以实现规避并发瓶颈并且线程安全的list。CopyOnWriteList用写时复制来规避读写冲突。
转载:
我认为在java.util.concurrent包中没有加入并发的ArrayList实现的主要原因是:很难去开发一个通用并且没有并发瓶颈的线程安全的List。
像ConcurrentHashMap这样的类的真正价值(The real point / value of classes)并不是它们保证了线程安全。而在于它们在保证线程安全的同时不存在并发瓶颈。举个例子,ConcurrentHashMap采用了锁分段技术和弱一致性的Map迭代器去规避并发瓶颈。
所以问题在于,像“Array List”这样的数据结构,你不知道如何去规避并发的瓶颈。拿contains() 这样一个操作来说,当你进行搜索的时候如何避免锁住整个list?
另一方面,Queue 和Deque (基于Linked List)有并发的实现是因为他们的接口相比List的接口有更多的限制,这些限制使得实现并发成为可能。
CopyOnWriteArrayList是一个有趣的例子,它规避了只读操作(如get/contains)并发的瓶颈,但是它为了做到这点,在修改操作中做了很多工作和修改可见性规则。 此外,修改操作还会锁住整个List,因此这也是一个并发瓶颈。所以从理论上来说,CopyOnWriteArrayList并不算是一个通用的并发List。
synchronizedList和 Vector的比较
synchronizedList指的是Collection.synchronizedList()生成的同步队列。
synchronizedList使用的是同步代码块,可以指定加锁对象。Vector是同步方法。
vector的listIterator()方法是同步的,synchronizedList不是。
SynchronizedList可以适配List接口下的实现。
为什么废弃Vector?
Vector的方法都是同步的,在不需要线程安全条件下使用ArrayList更好。
并发条件下synchronizedList更加灵活。
网友评论