线程池ThreadPoolExecutor-addWorker源码

addWorker是ThreadPoolExecutor新增线程的方法,线程安全的。

先从平民角度考虑addWorker的几点:(改变线程池的状态需要获取全局锁,也可以CAS)
1、如果线程池状态已经是关闭,则直接退出;
2、ThreadPoolExecutor的低29位代表工作线程数量,采用CAS的方法增加线程数量,expect必须是小于最大线程数的(具体看是不是核心线程),增加成功了就可以开启一个新线程处理任务了
3、开启新线程需要加锁,防止其他线程改变了线程池的状态。获取锁后也还需要检查线程池是否已经关闭,关闭了就直接退出
4、可以采用直接获取锁然后增加线程数量再开启线程,但这样并发不高,因为高并发下,可能CAS就很多失败了,没必要获取锁再判断
5、有一个问题:CAS增加线程数量但实际新线程还没开启怎么解决?答:还有HashSet workers,上面线程池的数量应该只是为了提高并发用的,竞争条件


版权声明:本文为weixin_42002747原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。