提到线程池就不得不说池化技术,那么什么是池化技术呢?
池化技术能够减少资源对象的创建次数,提高程序的性能。特别是高并发下这种提高更加明显。使用池化技术缓存的资源有如下特点:
- 对象的创建时间长
- 对象创建需要大量资源
- 对象创建后可被重复使用
有没有点儿像共享单车?
一个资源池需要具备如下功能:
- 租用资源对象
- 归还资源对象
- 清除过期资源对象
池化的对象需要保证无状态,如果有状态需要清除状态。 并非所有对象都适合拿来池化——因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。
在Java中可以自定义或者借用第三方类库(如:apache commons-pool)实现对象池
Apache commons-pool 就是个对象池,用途还是很多的,之前一直没有注意过。没细研究过,看网友大致是先创建两个集合,一个活跃集合一个使用中集合。每次移动集合到使用中集合。并删除活跃集合中的下标。来回在两个集合中游动。我想想?我感觉有更好的方法,形成一个双向链表。使用中的集合自动汇聚。
X :使用中节点 O :未使用节点
维持头节点:Head
尾节点:Tail
最后借出节点的下一个节点 :Work
步骤:
0.初始:
O -> O -> O -> O -> O
1.借对象时直接将未使用节点置为使用状态。将第二个节点置为Work
X -> O -> O -> O -> O
2.依次借,依次挪,从Work开始往下找,如果Work节点为使用中节点,则借对象阻塞
X -> X -> X -> X -> X <- Work <- Tail
3.如果还对象的话,就把当前使用中的对象状态重置为正常的状态,并直接拼接到尾部
X -> X -> X -> X -> O <- Work <- Tail
每次做的都是迁移操作,但是因为是指针所以时间复杂度没有那么高。
借和还 时间复杂度都是O (1) ,空间复杂度也是O (1)
线程池的优点:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
注意线程隔离。下单的线程池与询价的线程池不要用一个,这样如果一方线程池打满出问题,便会相互影响
标签:对象,创建,编程,干货,池化,集合,线程,节点 From: https://blog.csdn.net/weixin_39384775/article/details/141435250