并发集合类

并发集合类

1.集合类

(1) List

  1. LinkedList:是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。
  2. ArrayList:是数组实现的队列,它是一个动态数组;它也不是线程安全的,只适用于单线程。
  3. Vector:是数组实现的矢量队列,它也一个动态数组;不过和ArrayList不同的是,Vector是线程安全的,它支持并发。
  4. Stack:是Vector实现的栈;和Vector一样,它也是线程安全的。

(2)Set

  1. HashSet:是一个没有重复元素的集合,它通过HashMap实现的;HashSet不是线程安全的,只适用于单线程。
  2. TreeSet:也是一个没有重复元素的集合,不过和HashSet不同的是,TreeSet中的元素是有序的;它是通过TreeMap实现的;TreeSet也不是线程安全的,只适用于单线程。

(3)Map

  1. HashMap:是存储“键-值对”的哈希表;它不是线程安全的,只适用于单线程。
  2. WeakHashMap:是也是哈希表;和HashMap不同的是,HashMap的“键”是强引用类型,而WeakHashMap的“键”是弱引用类型,也就是说当WeakHashMap 中的某个键不再使用时,会被从WeakHashMap中被自动移除。WeakHashMap也不是线程安全的,只适用于单线程。
  3. Hashtable:也是哈希表;和HashMap不同的是,Hashtable是线程安全的,支持并发。
  4. TreeMap:也是哈希表,不过TreeMap中的“键-值对”是有序的,它是通过R-B Tree(红黑树)实现的;TreeMap不是线程安全的,只适用于单线程。
  5. LinkedHashMap

2.并发集合类

并发集合类_第1张图片

(1) List

  1. CopyOnWriteArrayList

(2) Set

  1. CopyOnWriteArraySet
  2. ConcurrentSkipListSet:是线程安全的有序的集合(相当于线程安全的TreeSet);它继承于AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,它也支持并发。

(3) Map

  1. ConcurrentHashMap:是线程安全的哈希表;它继承于AbstractMap类,并且实现ConcurrentMap接口。ConcurrentHashMap是通过“锁分段”来实现的,它支持并发。
  2. ConcurrentSkipListMap:是线程安全的有序的哈希表; 它继承于AbstractMap类,并且实现ConcurrentNavigableMap接口。ConcurrentSkipListMap是通过“跳表”来实现的,它支持并发。

(4) Queue

可以从以下两个维度来分类。一个维度是阻塞与非阻塞,所谓阻塞指的是当队列已满时,入队操作阻塞;当队列已空时,出队操作阻塞。

另一个维度是单端与双端,单端指的是只能队尾入队,队首出队;而双端指的是队首队尾皆可入队出队。Java 并发包里阻塞队列都用 Blocking 关键字标识,单端队列使用 Queue 标识,双端队列使用 Deque 标识。

  1. ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。
  2. LinkedBlockingQueue是单向链表实现的(指定大小)阻塞队列,该队列按 FIFO(先进先出)排序元素。
  3. LinkedBlockingDeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持FIFO和FILO两种操作方式。
  4. ConcurrentLinkedQueue是单向链表实现的无界队列,该队列按 FIFO(先进先出)排序元素。
  5. ConcurrentLinkedDeque是双向链表实现的无界队列,该队列同时支持FIFO和FILO两种操作方式。

Queue分类

  1. 单端阻塞队列

ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue 和 DelayQueue。内部一般会持有一个队列,这个队列可以是数组(其实现是 ArrayBlockingQueue)也可以是链表(其实现是 LinkedBlockingQueue);甚至还可以不持有队列(其实现是 SynchronousQueue),此时生产者线程的入队操作必须等待消费者线程的出队操作。而 LinkedTransferQueue 融合 LinkedBlockingQueue 和 SynchronousQueue 的功能,性能比 LinkedBlockingQueue 更好;PriorityBlockingQueue 支持按照优先级出队;DelayQueue 支持延时出队。

  1. 双端阻塞队列:其实现是 LinkedBlockingDeque。
  2. 单端非阻塞队列:其实现是 ConcurrentLinkedQueue。
  3. 双端非阻塞队列:其实现是 ConcurrentLinkedDeque。

只有 ArrayBlockingQueue 和 LinkedBlockingQueue 是支持有界的,所以在使用其他无界队列时,一定要充分考虑是否存在导致 OOM 的隐患。

并发集合类_第2张图片

你可能感兴趣的:(Java,容器)