java.util.concurrent包下集合类的特点与适用场景
java.util.concurrent包,此包下的集合都不允许添加null元素
序号 | 接口 | 类 | 特性 | 适用场景 |
1 | Queue、Collection | ArrayBlockingQueue | 有界、阻塞、线程安全、FIFO | 生产者、消费者场景比较合适,并且支持FIFO |
2 | Queue | LinkedTransferQueue | 阻塞、线程安全、FIFO |
LinkedTransferQueue实现了一个重要的接口TransferQueue,该接口含有下面几个重要方法: |
3 | Queue | PriorityBlockingQueue | 阻塞、优先级 | 要使用FIFO,您需要插入一个新的FIFOEntry(anEntry),而不是普通的entry对象 |
4 | Queue | SynchronousQueue | 阻塞、FIFO、线程安全、同步队列 | 只允许一个值添加、取出,无容量 |
5 | Queue | ConcurrentLinkedQueue | 线程安全、FIFO | 线程安全,但一边遍历一边poll还是不行的 |
6 | Deque | ConcurrentLinkedDeque | 线程安全、链表 | 链表式操作,可对队首队尾直接操作 |
7 | Map | ConcurrentHashMap | 非阻塞、线程安全 | |
8 | Map | ConcurrentSkipListMap | 线程安全 | 构造函数支持排序,甚至可按照复合类型字段排序 |
9 | Map | ConcurrentSkipListSet | 线程安全 |
构造函数支持排序,甚至可按照复合类型字段排序 |
10 | List | CopyOnWriteArrayList | 线程安全 |
1、读写分离,读和写分开,需要读和写时都是对拷贝的副本进行操作。 |
11 | Set | CopyOnWriteArraySet | 线程安全 | 1、读写分离,读和写分开,需要读和写时都是对拷贝的副本进行操作。 2、不存储重复对象 3、最终一致性 |
12 | Queue | DelayQueue | 阻塞、线程安全、FIFO | 某对象在getDelay方法返回0或者负数时,才能从take方法中获取到值,否则一直阻塞 |
13 | Queue | LinkedBlockingQueue | 有界、阻塞、线程安全、FIFO、链表 | |
14 | Deque | LinkedBlockingDeque | 有界、阻塞、线程安全、FIFO、链表 |
Queue和Deque的区别
Deque不仅具有FIFO的Queue实现,也有FILO的实现,也就是不仅可以实现队列,也可以实现一个堆栈。LinkedBlockingQueue和LinkedBlockingDeque的区别能比较好地体现Queue和Deque接口的区别。
参考网址:https://blog.csdn.net/vernonzheng/article/details/8267541
ArrayBlockingQueue和LinkedBlockingQueue的区别:
1. 队列中锁的实现不同
ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;
LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock
2. 在生产或消费时操作不同
ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能
3. 队列大小初始化方式不同
ArrayBlockingQueue实现的队列中必须指定队列的大小;
LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE
参考网址:https://blog.csdn.net/ustc_zn/article/details/54864244