java集合及concurrent并发包

集合包

集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对。

Collection中最常用的又分为三种类型的接口:List、Queue和Set,List和Set最明显的差别为List支持放入重复的元素,而Set不支持。

List最常用的实现类有:ArrayList、LinkedList、Vector及Stack;Set接口常用的实现类有:HashSet、TreeSet;Queue常用实现类有ConcurrentLinkedQueue和BlockingQueue(都是线程安全的,前者是非阻塞的);

List
非线程安全

ArrayList:基于数组方式实现;

LinkedList:基于双向链表机制实现;

线程安全

Vector:基于Synchronized实现的线程安全的ArrayList;

Stack:Stack继承于Vector,在其基础上实现了Stack所要求的后进先出(LIFO)的弹出与压入操作;

CopyOnWriteArrayList: CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的ArrayList,CopyOnWriteArrayList在兼顾了线程安全的同时,又提高了并发性,性能比Vector有不少提高。

Set
非线程安全

HashSet:HashSet基于HashMap实现,无容量限制;

TreeSet: TreeSet和HashSet的主要不同在于TreeSet对于排序的支持,TreeSet基于TreeMap实现;

线程安全

CopyOnWriteArraySet:CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法。保证了无重复元素,但在add时每次都要进行数组的遍历,因此性能会略低于CopyOnWriteArrayList。

Map
非线程安全

HashMap:基于数组+链表的结合体(链表散列)实现;

TreeMap: TreeMap基于红黑树的实现,因此它要求一定要有key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口;

线程安全

Hashtable:synchronized的HashMap;性能较差,被ConcurrentHashMap取代了。类似于ArrayList和Vector的关系
ConcurrentHashMap:ConcurrentHashMap是线程安全的HashMap的实现;锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问;

并发
ReentrantLock

ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。

Condition

Condition是并发包中提供的一个接口,典型的实现有ReentrantLock,ReentrantLock提供了一个mewCondition的方法,以便用户在同一个锁的情况下可以根据不同的情况执行等待或唤醒动作。