干货-并发编程提高——线程池(十二)

提到线程池就不得不说池化技术,那么什么是池化技术呢?

池化技术能够减少资源对象的创建次数,提高程序的性能。特别是高并发下这种提高更加明显。使用池化技术缓存的资源有如下特点:

  1. 对象的创建时间长
  2. 对象创建需要大量资源
  3. 对象创建后可被重复使用

有没有点儿像共享单车?

一个资源池需要具备如下功能:

  1. 租用资源对象
  2. 归还资源对象
  3. 清除过期资源对象

 池化的对象需要保证无状态,如果有状态需要清除状态。 并非所有对象都适合拿来池化——因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。

在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)

 

 

线程池的优点:

降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

注意线程隔离。下单的线程池与询价的线程池不要用一个,这样如果一方线程池打满出问题,便会相互影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值