需尽量减少线程数:线程池大小设为1还是创建多线程执行小任务?
问题解答
核心结论
选哪种方案,核心取决于你的synchronized块锁的对象以及任务是否允许并行执行:
优先选线程池大小为1的情况
如果你的500个类实例的synchronized块共用同一把锁(比如类锁,或者所有实例都绑定同一个全局锁对象),或者任务本身必须串行执行(比如依赖固定执行顺序、共享资源仅支持单线程操作),那线程池设为1是最优选择:
- 多个线程进来也会因为锁排队,本质还是串行执行,多线程反而会带来线程创建/销毁、上下文切换的额外开销。
- 固定大小1的线程池可以复用唯一的线程,完全避免重复创建销毁线程的损耗,同时满足所有任务的串行执行需求。
考虑用少量线程池而非临时创建线程的情况
只有当你的synchronized块是每个实例用自己的锁(实例锁),且不同实例的任务可以并行执行时,才需要用多线程处理,但绝对不要创建多个线程执行小任务后就终止:
- 频繁创建和销毁线程的开销远大于线程池复用线程的成本,哪怕是处理小任务,也应该用固定大小的线程池(大小可根据CPU核心数或实际可并行的任务数设置,远不需要500个)。
- 如果只是因为锁是实例锁就临时创建大量线程,反而会导致线程上下文切换过载,反而降低执行效率。
关键检查点
在做决定前,先确认两个关键点:
- 你的
synchronized块锁的是类对象(所有实例共用锁)还是实例对象(每个实例自己的锁)? - 不同实例的任务之间是否有依赖,是否允许并行执行?
内容的提问来源于stack exchange,提问作者P.Ellis
相关产品推荐
相关产品推荐

