Young87

当前位置:首页 >个人收藏

【Java集合】除了Vector,还有另一个提供线程安全的List是什么?

前言

金三银四,势在必得。我自信又有点紧张地走进了面试现场。

面试官:“我们先聊点Java基础吧,除了Vector,还有另一个提供线程安全的List是什么?”。

我:“我知道可以通过Collections.synchronizedList()方法,将线程不安全的List转为线程安全。"

面试官笑着说:“那么Collections.synchronizedList()的实现原理是什么?“。

我:“额…这个我不是很清楚”。

无疑,这这触及到了我的知识盲点。

面试官:“你可以了解一下SynchronizedList,没事,我们到下一个问题哈…"

面试结束后,我留下了学海无涯的泪水…

对于这个问题,我们的回答思路可以是这样:

  • SynchronizedList是什么呢?
  • 分析Vector与SynchronizedList之间的区别是什么?
  • 总结Vector和SynchronizedList之间的区别。

(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)

SynchronizedList是什么?

在了解SynchronizedList之前,让我们先看看SynchronizedList在什么位置:
在这里插入图片描述
我们可以看到,SynchronizedList结合了SynchronizedCollection和List的特性,这是有的小伙伴会在编辑器召唤这个类,但发现,怎么召唤不出来?因为,SynchronizedList是Collections的静态内部类

可以看到,将线程不安全的List转为线程安全的Collections.synchronizedList()方法,是通过生成SynchronizedList对象来实现的:

static <T> List<T> synchronizedList(List<T> list, Object mutex) {
        return (list instanceof RandomAccess ?
                new SynchronizedRandomAccessList<>(list, mutex) :
                new SynchronizedList<>(list, mutex));
    }

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

上文我们知道,SynchronizedList是java.util.Collections的静态内部类,那么Vector呢?
在这里插入图片描述
可以看到,Vector跟SynchronizedList都是List的小弟,而且Vector是java.util包中的一个类。

比较二者几个重要的方法

1. 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);
}

可以看到Vector的insertElementAt()方法使用了synchronized关键字来实现线程安全。不过这段代码的操作好面熟啊。是的,其实Vector与ArrayList除了线程安全方面有所不同,两者之间的代码都很相似,有兴趣的朋友可以看这篇文章:

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 路飞学城之 luffy (2 )

下一篇: webpack之css文件处理

精华推荐