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
java.util.concurrent包下集合类的特点与适用场景的更多相关文章
- Java中java.util.concurrent包下的4中线程池代码示例
先来看下ThreadPool的类结构 其中红色框住的是常用的接口和类(图片来自:https://blog.csdn.net/panweiwei1994/article/details/78617117 ...
- java.util.concurrent包下并发锁的特点与适用场景
序号 类 备注 核心代码 适用场景 1 synchronized 同步锁 并发锁加在方法级别上,如果是单例class对象,则只能允许一个线程进入public synchronized void doX ...
- Java并发编程之java.util.concurrent包下常见类的使用
一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public class Co ...
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...
- java.util.concurrent包
在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...
- java.util.concurrent包API学习笔记
newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...
- 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分
这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int ...
- 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这 ...
- 高并发编程基础(java.util.concurrent包常见类基础)
JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...
随机推荐
- 运维ps语法---》ps、pstree、top、htop、nice、renice、kill、ulimit、w 和 who 和 whoami、pgrep、fg 和 bg、ipcs
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- TiDB初步概念
阅读官方文档画以下路线图: 储存: rockDB用于单机数据固化:完全理解 raft用于分布式数据同步:完全理解 最终对外展示一整个完全有序的Key-Value序列:完全理解 重点:有序,就可以随机访 ...
- Archlinux安装总结
Archlinux安装总结 一.引导 1.BIOS与UEFI root@archiso ~ # ls /sys/firmware/efi/efivars ls: cannot access '/sys ...
- 两个action之间进行跳转
名字 说明 Chain 用来处理Action链 Dispatcher 用来转向页面,通常处理JSP FreeMarker 处理FreeMarker模板 HttpHeader 用来控制特殊的Http行为 ...
- 如何引入iconfont图标与Element-UI组件
一.iconfont图标 iconfont方便又好用,介绍一下如何在vue项目中引入iconfont 1.进入iconfont官网 www.iconfont.cn 2.登录自己账户 3.选择图标后下载 ...
- Feign源码解析系列-那些注解们
开始 Feign在Spring Cloud体系中被整合进来作为web service客户端,使用HTTP请求远程服务时能就像调用本地方法,可见在未来一段时间内,大多数Spring Cloud架构的微服 ...
- pycrypto安装各种方法试了,最后这种最快速最方便
需要安装vs,然后按照如下步骤 这个不是在cmd中执行 而是在vs的命令行中执行
- docker ,docker与虚拟机的区别
什么是Docker: 1.Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 L ...
- Go小爬虫测试
package main import ( "fmt" "io/ioutil" "log" "net/http" ) t ...
- PHP之魔术方法
PHP中的魔术方法: PHP的魔术方法主要是在特定的条件下执行相应的魔术方法.这和很多框架中的钩子函数有些类似,不同的是,钩子函数是在生命周期的某个周期内自动执行,而魔术方法是在触发某种条件下自动 ...