Java并发集合框架简介
一、Java集合框架结构
Java语言的集合框架父接口是Iterable,从这个接口向下一一继承。
(1) 接口Iterable:主要作用是迭代循环。声明了一个iterator()方法进行循环处理。
(2) 接口Collection:提供了集合框架最主要和常用的操作,例如size(),add(),isEmpty()等等。
(3) 接口List:对Collection接口进行了扩展,允许根据索引位置操作数据,并且内容允许重复。List最常用的非并发实现类就是ArrayList,它是非线程安全的。如果要使用线程安全的链表可以使用Vector类。
(4) 接口Set:对Collection接口进行了扩展,特点是内容不允许重复,排序方式为自然排序。实现类hashset是不支持并发操作的。LinkedHashSet可以有序的组织元素。TreeSet实现了sortedSet接口,可以对元素进行排序。
(5) 接口Queue:对Collection接口进行了扩展,它的特点是可以方便的操作列头。实现类PriorityQueue是非并发的。
(6) 接口Deque:支持对表头和表尾的操作,又名“双端队列”。非并发实现类有ArrayDeque和LinkedList。
二、非阻塞队列
非阻塞队列的特点是队列里面没有数据时,操作队列出现异常或者返回null,不具有等待/阻塞的功能。
在JDK并发包中,常见的非阻塞队列有:
(1) ConcurrentHashMap:是支持并发操作的Map对象。Hashtable类也是线程安全的类,与ConcurrentHashMap的区别:当多个线程分别调用该类的iterator()方法返回Iterator对象后,再调用remove()时会出现ConcurrentModificationException异常,也就是说Hashtable不支持Iterator并发的删除,但是ConcurrentHashMap是支持的。
(2) ConcurrentSkipListMap:是支持排序的Map。
(3) ConcurrentSkipListSet:是支持排序而且不允许重复元素的。
(4) ConcurrentLinkedQueue:提供的是并发环境的队列操作。
(5) ConcurrentLinkedDeque:支持队头和队尾的双重操作。
(6) CopyOnWriteArrayList:是线程安全的ArrayList。
(7) CopyOnWriteArraySet:是解决多线程情况下HashSet不安全的问题。
三、阻塞队列
所谓阻塞队列Blocking Queue,其实就是如果BlockQueue是空的,那么取的操作就被阻塞等待,知道BlockingQueue添加了元素才会被唤醒。如果,BlockingQueue是满的,没有空余,试图向队列中存放元素的操作也会被阻塞进入等待,直达有剩余空间才会被唤醒继续操作。
(1) 类ArrayBlockingQueue:提供一种有界阻塞队列的功能。
(2) 类PriorityBlockingQueue:支持在并发情况下的优先级队列。
(3) 类LinkedBlockingQueue:是无界的。
(4) 类LinkedBlockingDeque:提供对双端结点的操作,两者都具有阻塞特性。
(5) 类SynchronousQueue:是异步队列,每个插入操作必须等待另一个线程的对应移除操作,不能在同步队列上进行peerk,也不能迭代队列。 常被使用在多个线程之间传输数据时。
(6) 类DelayQueue:提供一种延时执行任务的队列。
(7) 类LinkedTransferQueue:提供的功能和SynchronousQueue类似,但是具有嗅探功能,可以常识性的添加一些数据。