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:无缓冲等待队列。