2021 December 06 池
对象池
概览
适用场景
- 维护一些很大,创建很慢的对象,提升性能
- 学习成本,增加代码的复杂度
commons-pool2
ObjectPool
- BaseObjectPool:抽象类,用来扩展自己的对象池
- ErodingObjectPool:“腐蚀”对象池,代理一个对象池,并基于factor参数,为其添加”腐蚀”行为,归还的对象被腐蚀后,将会丢弃,而不是添加到空闲容量中
- GenericObjectPool:一个可配置的通用对象池实现
- ProxiedObjectPool:代理一个其它的对象池,并基于动态代理(支持JDK代理和CGLib代理),返回一个代理后的对象
- SoftPeferenceObjectPool:基于软引用的对象池
- SynchronizedObjectPool:代理一个其它对象池,并为其提供线程安全的能力
核心API
- borrowObject():从对象池中借对象
- returnObject():将对象归还到对象池
- invalidateObject():失效一个对象
- addObject():增加一个空闲对象
- clear():清空空闲的所有对象,并释放相关资源
- close():关闭对象池,并释放相关资源
- getNumdle():获得空闲对象的数量
- getNumActive():获得被借出对象数量
PooledObjectFactory
- BasePooledObjectFactory:抽象类,用于扩展自己的PooledObjectFactory
- PoolUtils.SynchronizedPooledObjectFactory:内部类,代理一个其他的PooledObjectFactory,实现线程同步
PooledObjectFactory核心API
- makeObject():创建一个对象实例,并将其包装成一个PooledObject
- destroyObject():销毁对象
- validateObject():校验对象,确保对象池返回的对象是OK的
- activateObject():重新初始化对象
- passivateObject():取消初始化对象
KeyedObjectPool
- ErodingKeyedObjectPool:类似ErodingObjectPool
- GenericKeyedObjectPool:类似GenericObjectPool
- ProxiedKeyedObjectPool:类似ProxiedObjectPool
- SynchronizedKeyedObjectPool:类似SynchronizedObjectPool
Abandon与Evict区别
- Abandon(废弃):ABANDONED是对象池对象的一个状态,对象还在对象池中
- Evict:清理对象的过程,清理的不一定是ABANDONED对象
线程池
线程池好处
ThreadPoolExecutor
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:允许的空闲时间
- TimeUnit:keepAliveTime的单位
- workQueue:存储等待执行的任务
- threadFactory:defaultThreadFactory(默认):创建的线程拥有相同优先级,非守护线程,有线程名称
- rejectHandler:拒绝任务的策略
BlockingQueue
- ArrayBlockingQueue:有界,内部基于数组实现,初始化时必须指定容量大小,一旦指定,就不能再修改
- LinkedTransferQueue:无界,基于链表,用于数据交换,比其他队列多了transfer()及tryTransfer()方法
- DelayQueue:无界,其中的元素必须实现Delayed接口,其中的元素需要排序,一般情况下按照过期时间的优先级排序,使用场景(定时关闭连接,缓存对象,超时处理)
- LinkedBlockingQueue:容量可选,默认无界(Integer.MAX_VALUE),基于链表实现
- PriorityBlockQueue:无界,带优先级的阻塞队列,允许插入NULL对象,元素必须实现Copa让步了接口,队列的排序规则需要用到
- SynchronousQueue:有界,不存储元素,一个线程发起插入操作后,就会被阻塞,直到另一个线程发起相应的删除操作才会恢复
ForkJoinPool
- JDK7开始提供
- 把一个大任务拆分成若干个小人物,最终再把每个小任务的结果汇总的框架
- 比较适合分而治之,递归计算的CPU密集场景
Executors
- 创建线程池的工厂以及工具
- newCachedThreadPool():缓存型线程池,会先查看池中是否有以前建立的线程,有就复用,没有就新建,适合用于生命周期很短的异步任务
- newFixedThreadPool():固定线程池,任意时间最多只有固定数目的活动线程存在,适用于线程数比较稳定的并发线程场景
- newSingleThreadExecutor():任意时间池中只有一个线程,保证任务按照指定顺序执行,适用于需要严格控制执行顺序的场景
- newScheduledThreadPool():创建一个有调度能力的线程池,返回ScheduleThreadPoolExecutor,适用于定时任务,延时任务
- newWorkStealingPool():创建一个ForkJoinPool,适用于分而治之,递归计算的CPU密集场景
线程数调优
- N(CPU核心数)
- CPU密集型任务:N+1
- IO密集型任务:2N
- 混合型任务:NU(1+WT/ST)-N:CPU核心数,U:目标CPU利用率,WT:线程等待时间,ST:线程运行时间
BlockingQueue调优
连接池
- 获取连接-执行业务-归还连接
- 连接数:2N(CPU核心数)+可用磁盘数
- 分离:2个连接池