阅读 87

重学Java-基础篇-集合类三

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…

文章分类
后端
文章标签