面试:线程安全的集合
线程安全的集合:
线程安全的集合有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思想就能使数组容量满足要求。