ArrayList和Vector以及synchronizedList
2016-06-19 17:08
232 查看
ArrayList和Vector都是使用数组方式存储数据
区别大概就是Vector本身所有方法都是用synchronized修饰的,所以线程安全,而ArrayList没有
还有一个区别就是新增元素的时候Vector的增量是原来的一倍,而ArrayList增加原来的一半
synchronizedList修饰的list如下
private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>());
包裹了普通的ArrayList提供了线程安全的机制,类似Vector,所以到此为止synchronizedList与Vector的区别就是ArrayList与Vector的增量速度区别,所以需要线程安全操作时,增量比较快的时候推荐使用Vector,其他就没什么了
但是注意一点,
synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,为什么呢?
首先讲下为什么要手动加线程锁代码:
因为迭代器涉及的代码没有在java api中没有加上线程同步代码
原因:整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list)
E-mail: huahuiyang@gmail.com https://cn.linkedin.com/pub/huahui-yang/91/13a/105
区别大概就是Vector本身所有方法都是用synchronized修饰的,所以线程安全,而ArrayList没有
还有一个区别就是新增元素的时候Vector的增量是原来的一倍,而ArrayList增加原来的一半
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
synchronizedList修饰的list如下
private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>());
包裹了普通的ArrayList提供了线程安全的机制,类似Vector,所以到此为止synchronizedList与Vector的区别就是ArrayList与Vector的增量速度区别,所以需要线程安全操作时,增量比较快的时候推荐使用Vector,其他就没什么了
但是注意一点,
* It is imperative that the user manually synchronize on the returned * list when iterating over it: * <pre> * List list = Collections.synchronizedList(new ArrayList()); * ... * synchronized(list) { * Iterator i = list.iterator(); // Must be in synchronized block * while (i.hasNext()) * foo(i.next()); * }
synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,为什么呢?
首先讲下为什么要手动加线程锁代码:
public boolean addAll(int index, Collection<? extends E> c) { synchronized(mutex) {return list.addAll(index, c);} } public ListIterator<E> listIterator() { return list.listIterator(); // Must be manually synched by user }
因为迭代器涉及的代码没有在java api中没有加上线程同步代码
原因:整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list)
E-mail: huahuiyang@gmail.com https://cn.linkedin.com/pub/huahui-yang/91/13a/105
相关文章推荐
- C#.Net ArrayList的使用方法
- VBS ArrayList Class vbs中的数组类
- C++ Vector用法详解
- 详解C++编程中的vector类容器用法
- 详解C++中的vector容器及用迭代器访问vector的方法
- C#中数组Array,ArrayList,泛型List详细对比
- C#中Arraylist的sort函数用法实例分析
- C#中ArrayList的使用方法
- C#中Array与ArrayList用法及转换的方法
- 大家注意vector, list, set, map成员函数erase
- java中vector与hashtable操作实例分享
- C++ vector删除符合条件的元素示例分享
- C#生成随机ArrayList的方法
- C++中vector容器的常用操作方法实例总结
- 使用C语言实现vector动态数组的实例分享
- c# ArrayList的使用方法小总结
- PHP实现C#山寨ArrayList的方法
- C++ Vector用法深入剖析
- vector与map的erase()函数详细解析
- PowerShell中使用ArrayList实现数组插入、删除、添加例子