Synchronized内容总结(三)
前面两部分谈到多线程对内部锁的优化,以及代码中对锁的优化。是从减少竞态的角度来优化程序的。 如果从提高线程执行效率,来对多线程程序进行优化,自然让人联想到了线程池技术。
基本概念与原理
由于生成和维持这些线程是需要耗费资源了,维持太多或者太少的线程都会对系统运行效率造成影响,因此对线程池优化是有意义的。
在做线程池调优之前,先介绍一下线程的几个基本参数,以及线程池运行的原理:
- corePoolSize,线程池的基本大小,无论是否有任务需要执行,线程池中线程的个数。只有在工作队列占满的情况下,才会创建超出这个数量的线程。
- maximumPoolSize,线程池中允许存在的最大线程数。
- poolSize,线程池中线程的数量。
- 线程池中的线程数还没有达到基本大小,也就是 poolSize<corePoolSize 时。新增一个线程处理任务,即使线程池中存在空闲的线程。
- 线程池中的线程数大于或等于基本大小,也就是 poolSize>=corePoolSize,并且任务队列未满时,将任务提交到阻塞队列排队等候处理。
- 如果当前线程池的线程数大于或等于基本大小,也就是 poolSize>=corePoolSize 且任务队列占满时,需要分两种情况考虑。
①当 poolSize<maximumPoolSize,新增线程来处理任务;
②当 poolSize=maximumPoolSize,线程池的处理能力达到极限,因此拒绝新增加的任务。
线程池容量配置
因此在 IO 优化中发现一个估算公式:
最佳线程数目=((线程等待时间+线程 CPU 时间)/线程 CPU 时间 )* CPU 数目。
将公式进一步化简,得到:
最佳线程数目= (线程等待时间与线程 CPU 时间之比+1)* CPU 数目。
总结
- 针对锁的优化
- 线程池优化
作者:崔皓 简介:十六年开发和架构经验,曾担任过惠普武汉交付中心技术专家,需求分析师,项目经理,后在创业公司担任技术/产品经理。善于学习,乐于分享。目前专注于技术架构与研发管理。
编辑:陶家龙、孙淑娟