juc并发
2019-06-25 16:39:26 1 举报
AI智能生成
juc,java 并发编程
作者其他创作
大纲/内容
关键字
volatile
特性
可见性
happens-before规则保证线程之间内存可见性
原子性
单个volatile读写有原子性,不包括volitle++这种复合操作
实现
字节码中插入内存屏障,禁止指令重排
final
特性
对象引用被任意线程可见之前,对象的final域已经被正确初始化过
锁
AbstractQueuedSynchronizer(一个同步队列,多个等待队列)
组成
int变量标识同步状态
fifo队列
独占式同步状态获取
获取同步状态失败的线程加入到队列中,并且在队列中自旋
移除队列的条件是前驱节点是头节点,并成功获取了同步状态
共享式同步状态获取
Condition (每个condition都包含一个等待队列)
await()
以当前线程构造节点,并且将节点从尾部加入等待队列,非cas操作
会释放锁
await方法返回时,一定获得了condition相关联的锁
signal()
线程池
优点
降低资源消耗
通过重复利用已经创建的线程降低线程创建和销毁造成的消耗
提高响应速度
任务到达时,不需要等待创建线程立即执行
提高线程可管理性
统一分配、调优和监控
流程
核心线程是否已满,如果不是,创建一个工作线程来执行任务
需要全局锁
工作队列是否已满,如果不是,则将任务存储在工作队列
判断所有线程是否都处于工作状态,如果不是,则创建新的工作线程,如果是,这交给饱和策略
核心参数
corePoolSize(核心线程数)
runnableTaskQueue(任务队列)
ArrayBlockingQueue
基于数组的有界阻塞队列
fifo
LinkedBlockingQueue
基于链表的阻塞队列
Executors.newFixedThreadPool()
SynchronnousQueue
不存储元素的阻塞队列
每个插入必须等待移除操作
Executors.newCachedThreadPool()
PriorityBloclingQueue
具有优先级的无限阻塞队列
maximumPoolSize(线程最大数量)
如果使用了无界队列,该参数无意义
ThreadFactory
设置创建线程的工厂
RejectExecutionHandler(饱和策略)
AbortPolicy(直接抛出异常)(默认策略)
CallerRunsPolicy
只用调用者所在线程执行任务
DiscardOldestPolicy
丢弃队列里最近的任务,执行当前任务
DiscardPolicy
不处理,丢弃掉
keepAliveTime
线程池空闲后保持的存活时间
提交任务
execute
提交不需要返回值的任务
submit
提交需要返回值的任务,返回future对象
配置
cpu密集型
尽可能少的线程,比如cpu核心数+1
io密集型
尽可能多的线程,比如cpu核心数*2
Executor
ThreadPoolExecutor
FixedThreadPool
适用于满足资源管理的需求
需要限制当前线程数量的应用场景
适用于负载比较重的服务器
使用LinkedBlockingQueue
线程池数量不会超过corePoolSize
keepAliveTime无效
不会拒绝任务
SingleThreadExecutor
保证顺序的执行各个任务
corePoolSize和maximumPoolSize为1
使用LinkedBlockingQueue
CachedThreadPool
大小无界的线程池
适用于很多短期异步任务的小程序
负载较轻的服务器
corePoolSize为0
keepAliveTime是60秒
使用SynchronousQueue
极端情况会因为创建过多线程耗尽Cpu资源
ScheduledThreadPoolExecutor
SingleThreadScheduledExecutor
单个线程执行周期任务
按顺序执行任务
ScheduledThreadPoolExecutor
需要多个后台线程执行周期任务
需要限制后台线程数量需求
0 条评论
下一页