Java高并发容器

JUC基于非阻塞算法(Lock Free,无锁编程)提供了一组高并发容器,包括高并发的List、Set、Queue、Map容器。

1、什么是高并发容器

JUC高并发容器基于非阻塞算法(或者无锁编程算法)实现的容器类,无锁编程算法主要通过CAS(Compare And Swap)+ Volatile组合实现,通过CAS保障操作的原子性,通过volatile保障变量内存的可见性。

2、List

JUC包中的高并发List主要有CopyOnWriteArrayList,对应的基础容器为ArrayList。

CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口。在读多写少的场景中,其性能远远高于ArrayList的同步包装容器。

3、Set

JUC包中的Set主要有CopyOnWriteArraySet和ConcurrentSkipListSet。

CopyOnWriteArraySet继承自AbstractSet类,对应的基础容器为HashSet。其内部组合了一个CopyOnWriteArrayList对象,它的核心操作是基于CopyOnWriteArrayList实现的。

ConcurrentSkipListSet是线程安全的有序集合,对应的基础容器为TreeSet。它继承自AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。

4、Map

JUC包中Map主要有ConcurrentHashMap和ConcurrentSkipListMap。

ConcurrentHashMap对应的基础容器为HashMap。JDK 6中的ConcurrentHashMap采用一种更加细粒度的“分段锁”加锁机制,JDK 8中采用CAS无锁算法。

ConcurrentSkipListMap对应的基础容器为TreeMap。其内部的Skip List(跳表)结构是一种可以代替平衡树的数据结构,默认是按照Key值升序的。

5、Queue

JUC包中的Queue的实现类包括三类:单向队列、双向队列和阻塞队列。

ConcurrentLinkedQueue是基于列表实现的单向队列,按照FIFO(先进先出)原则对元素进行排序。新元素从队列尾部插入,而获取队列元素则需要从队列头部获取。

ConcurrentLinkedDeque是基于链表的双向队列,但是该队列不允许null元素。作为双向队列,ConcurrentLinkedDeque可以当作“栈”来使用,并且高效地支持并发环境。

除了提供普通的单向队列、双向队列外,JUC拓展了队列,增加了可阻塞的插入和获取等操作,提供了一组阻塞队列,具体如下:

1)ArrayBlockingQueue:基于数组实现的可阻塞的FIFO队列。

2)LinkedBlockingQueue:基于链表实现的可阻塞的FIFO队列。

3)PriorityBlockingQueue:按优先级排序的队列。

4)DelayQueue:按照元素的Delay时间进行排序的队列。

5)SynchronousQueue:无缓冲等待队列。

你可能感兴趣的:(Java高并发容器)