多线程并发调用ThreadPoolExecutor.submit()的处理机制及原子性问询
ThreadPoolExecutor并发调用submit的处理机制
核心结论
ThreadPoolExecutor的submit方法是线程安全的,多线程并发调用不会出现线程安全问题,无需额外加锁。
底层逻辑解析
submit的本质
submit方法只是将传入的Runnable/Callable包装为FutureTask,最终调用的是线程池的execute方法,核心逻辑都在execute里实现。execute方法的线程安全保障
execute方法内部通过**ReentrantLock(mainLock)**来保证临界区代码的原子性:- 判断线程池运行状态(如是否处于RUNNING状态)
- 尝试将任务添加到工作队列
- 决定是否创建新的工作线程
- 处理任务提交失败的降级逻辑
这些操作都在持有mainLock的情况下执行,确保同一时间只有一个线程能修改线程池的核心状态(如工作线程数、队列任务数、运行状态),避免并发下的状态不一致。
为什么源码中看不到submit的原子性
因为锁机制并非直接在submit方法中实现,而是下沉到了execute方法里。直接看submit的代码会误以为没有原子性保障,但底层依赖的execute已经处理了并发安全问题。
实用建议
- 无需自行给
submit方法加锁,线程池原生已经支持并发提交,额外加锁会导致性能损耗。 - 如果自定义线程池扩展逻辑,注意不要破坏
mainLock的使用逻辑,避免引入线程安全问题。 - 若遇到任务提交的性能瓶颈,可根据业务场景调整工作队列类型(如用
SynchronousQueue替代LinkedBlockingQueue)或线程池参数,但无需担心并发提交的安全性。
内容的提问来源于stack exchange,提问作者Flipz
相关产品推荐
相关产品推荐

