SynchronizedList和Vector的区别
-
SynchronizedList 是 java.util.Collections的一个静态内部类,使用Collections.synchronizedList(List list)方法来返回一个线程安全的List
-
Vector是 java.util包的一个类,Vector 是线程安全的所以可以在多线程的场景下可以直接使用
-
Vector和Arraylist都是List的子类,他们底层的实现都是一样的
List<String> list = new ArrayList<String>();
List list2 = Collections.synchronizedList(list);
Vector<String> list1 = new Vector<String>();
方法实现区别
add 方法
Vector
public void add(int index, E element) {
insertElementAt(element, index);
}
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
SynchronizedList
public void add(int index, E element) {
synchronized (mutex) {
list.add(index, element);
}
}
// 调用 Arraylist 的方法
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
从上面两段代码中发现有两处不同:
1.Vector使用同步方法实现,synchronizedList使用同步代码块实现。
2.两者的扩充数组容量方式不一样(两者的add方法在扩容方面的差别也就是ArrayList和Vector的差别。)
总结
同步代码块和同步方法的区别
1.同步代码块在锁定的范围上可能比同步方法要小,一般来说锁的范围大小和性能是成反比的。
2.同步块可以更加精确的控制锁的作用域(锁的作用域就是从锁被获取到其被释放的时间),同步方法的锁的作用域就是整个方法。
3.同步代码块可以选择对哪个对象加锁,但是静态方法只能给this对象加锁。
SynchronizedList和Vector最主要的区别
1.SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
2.使用SynchronizedList的时候,进行遍历时要手动进行同步处理。
3.SynchronizedList可以指定锁定的对象
学习Java工程师成神之路 hollischuang.gitee.io/tobetopjava…