Vector与SynchronizedList
之前面试遇到的问题vector和Collections.synchronizedList(),下来查看资料、源码后进行总结如下:
1.SynchronizedList是什么
2.Vector与SynchronizedList之间的区别是什么
3.Vector和SynchronizedList之间的区别总结
SynchronizedList是什么?
SynchronizedList结合了SynchronizedCollection和List的特性,这是有的小伙伴会在编辑器召唤这个类,但发现,怎么召唤不出来?因为,SynchronizedList是Collections的静态内部类。
可以看到,将线程不安全的List转为线程安全的Collections.synchronizedList()方法,是通过生成SynchronizedList对象来实现的:
Vector与SynchronizedList之间的区别是什么?
SynchronizedList是java.util.Collections的静态内部类,那么Vector呢?
Vector跟SynchronizedList都是List的小弟,而且Vector是java.util包中的一个类。
比较二者几个重要的方法
1. add()方法
Vector:
可以看到Vector的insertElementAt()方法使用了synchronized关键字来实现线程安全。其实Vector与ArrayList除了线程安全方面有所不同,两者之间的代码都很相似
我们来看看ArrayList的add()方法代码,除了没有synchronized修饰方法,还真的很相似:
注:在面试的时候可以略微带点ArrayList的知识点,列ArrayList与Vector之间的不同点:
-
线程安全:ArrayList是线程不安全的,Vector是线程安全的。
-
扩容机制:ArrayList扩容为原始容量的1.5倍,而Vector扩容为原始容量的2倍。
SynchronizedList:
在SynchronizedList在初始化的时候,会传入一个List:
而这里的list.add()会根据传入的List类型,决定SynchronizedList.add()的实现方式。
从上面代码可以看到,Vector使用同步方法实现线程安全,而SynchronizedList使用代码块实现。
2. remove()方法
Vector:
ArrayList:
SynchronizedList:
SynchronizedList中的remove()方法,虽然加上了synchronized代码块,但remove()方法实现是按照传入List类的remove()方法来移除的。
通过上面的段代码比对,可以看到除了Vector的remove()方法是使用了synchronized关键字来实现线程安全的
总结Vector与SynchronizedList之间的不同
我们可以看到Vector与SynchronizedList之间的不同在于:
1.锁:SynchronizedList可以指定锁定的对象。
2.扩容机制:Vector的扩容机制是固定的,而SynchronizedList可以根据出传入List类型确定扩容。
3.SynchronizedList中的ListIterator和ListIterator(int index)并没有做同步处理,而Vector加了锁的
4.将继承了List类的子类转换成SynchronizedList,是不需要改变它的底层数据结构,而Vector底层结构是使用数组实现的
所以Vector和SynchronizedList之间最主要的区别是:
-
SynchronizedList无需改变List类的子类的数据结构,就可以将它们转换成线程安全的类,而Vector不能。
-
SynchronizedList遍历时没有进行同步处理,Vector的遍历方法是线程安全的。
-
SynchronizedList可以指定锁定的对象,Vector的锁定范围是方法。