# 《并发设计模式》第48章-串行线程封闭模式-优化报表系统导出数据功能
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:了解串行线程封闭模式的核心原理与使用场景,能够初步结合自身项目实际场景思考如何将串行线程封闭模式灵活应用到自身实际项目中。
大家好,我是冰河~~
串行线程封闭模式的核心思想就是通过将多个并发的任务存入队列实现任务的串行执行,并且会为串行执行的任务创建唯一的一个工作线程进行处理。由于只有一个线程执行任务,自然无需对这些任务所访问的非线程安全对象加锁,从而避免了由于加锁带来的性能开销,也避免了死锁等一系列的问题。
# 一、故事背景
小菜在老王的指导下使用单线程线程池初步解决了报表系统导出数据错乱的问题,也通过老王了解到使用串行线程封闭模式可以很好的解决问题。并且老王也为小菜详细的讲解了什么是串行线程封闭模式。了解完这些内容后,小菜极力想基于串行线程封闭模式优化报表系统。但是缺乏实际项目应用经验,不得不再次向老王请教,老王还是不厌其烦的为其讲解。
# 二、问题回顾
公司生产环境的报表系统导出数据时,总是产生数据错乱的问题,经过排查和分析问题,发现是报表系统统计数据时,会将一个大的任务拆分成多个小的子任务,并且同一个任务下的所有子任务之间,具有严格的执行顺序,按照业务逻辑分析,同一个任务下的子任务需要由同一个线程分析和统计,但是生产环境同一个任务下的子任务却出现了由不同线程分析和统计的现象,这就导致了数据错乱的问题,如图48-1所示。
以上图中的任务A为例,假设任务A下有子任务A-1和子任务A-2两个子任务,子任务A-1和子任务A-2的执行有着严格的执行顺序,也就是说必须执行完子任务A-1,得出结果数据后,再执行子任务A-2。但是,此时却出现了线程A执行子任务A-1,线程C执行子任务A-2的情况,由于无法保证线程A和线程C的执行顺序,此时就会出现数据错乱的问题。
# 三、初步解决
为了保证按照严格的顺序执行每个任务下的子任务,需要将这些任务放到同一个线程中执行,这样不仅能够按照严格的顺序执行任务,也能够避免由于多线程加锁带来的开销。使用线程池初步解决问题的流程如图48-2所示。
可以看到,使用只有一个线程的线程池执行所有任务,不仅能够保证每个任务的执行顺序,还能避免由于多线程之间的加锁带来的性能开销问题。
# 四、串行线程封闭模式流程
使用串行线程封闭模式时,会将多个并发执行的任务存入队列实现任务的串行执行,并且会为串行执行的任务创建唯一的一个工作线程进行处理,如图48-3所示。
# 查看全文
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码