面试:线程安全的集合

线程安全的集合:

线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。

1、Vector相当于 ArrayList 的翻版,是长度可变的数组,Vector的每个方法都加了 synchronized 修饰符,是线程安全的。

2、Hashtable是一个线程安全的集合,是单线程集合,它给几乎所有public方法都加上了synchronized关键字。

3、Stack继承于Vector, 栈是后进先出的。

4、ConcurrentHashMap 采用了分段锁(Segment),HashTable的加锁方法是给每个方法加上synchronized关键字,线程安全。

5、ArrayBlockingQueue不同于ConcurrentLinkedQueue,ArrayBlockingQueue是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的。

6、ConcurrentLinkedQueue是一种FIFO的无界队列,是线程安全的,它适用于“高并发”的场景。

7、LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 使用CAS机制保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多

ArrayBlockingQueue不同于ConcurrentLinkedQueue,ArrayBlockingQueue是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的。

线程安全的list:

一、Vector

Vector是大家熟知的线程安全的List集合,不过他的性能是最差,所有的方法都是加了synchronized来同步,从而保证线程安全。使用数组来存储数据。 它的增加、修改、获取、删除等都通过synchronized来同步。

二、Collections.SynchronizedList

SynchronizedList是Collections类的静态内部类,它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性。

它所有方法都是带同步对象锁的,和 Vector 一样,它不是性能最优的。

三、CopyOnWriteArrayList

它的添加时加锁的(ReentrantLock ,非synchronized同步锁),读操作是没有加锁。

添加或者删除元素时,先加锁,再进行复制替换操作,最后再释放锁。 

它的优势在于,读操作是不加任和锁。这样做的好处是,在高并发情况下,读取元素时就不用加锁,写数据时才加锁,大大提升了读取性能。

Vector和CopyOnWriteArrayList都是线程安全的List,底层都是数组实现的,Vector的每个方法都进行了加锁,而CopyOnWriteArrayList的读操作是不加锁的,因此CopyOnWriteArrayList的读性能远高于Vector,Vector每次扩容的大小都是原来数组大小的2倍,而CopyOnWriteArrayList不需要扩容,通过COW思想就能使数组容量满足要求。