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

Vector与SynchronizedList之间的区别是什么?

SynchronizedList是java.util.Collections的静态内部类,那么Vector呢?

Vector跟SynchronizedList都是List的小弟,而且Vector是java.util包中的一个类。

比较二者几个重要的方法

1. add()方法

Vector:

Vector与SynchronizedList

可以看到Vector的insertElementAt()方法使用了synchronized关键字来实现线程安全。其实Vector与ArrayList除了线程安全方面有所不同,两者之间的代码都很相似

我们来看看ArrayList的add()方法代码,除了没有synchronized修饰方法,还真的很相似:

Vector与SynchronizedList

注:在面试的时候可以略微带点ArrayList的知识点,列ArrayList与Vector之间的不同点:

  • 线程安全:ArrayList是线程不安全的,Vector是线程安全的。

  • 扩容机制:ArrayList扩容为原始容量的1.5倍,而Vector扩容为原始容量的2倍。

SynchronizedList:

Vector与SynchronizedList

在SynchronizedList在初始化的时候,会传入一个List:

Vector与SynchronizedList

而这里的list.add()会根据传入的List类型,决定SynchronizedList.add()的实现方式。

从上面代码可以看到,Vector使用同步方法实现线程安全,而SynchronizedList使用代码块实现。

2. remove()方法
Vector

Vector与SynchronizedList

ArrayList:Vector与SynchronizedList

SynchronizedList:

Vector与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之间最主要的区别是:

  1. SynchronizedList无需改变List类的子类的数据结构,就可以将它们转换成线程安全的类,而Vector不能。

  2. SynchronizedList遍历时没有进行同步处理,Vector的遍历方法是线程安全的。

  3. SynchronizedList可以指定锁定的对象,Vector的锁定范围是方法。