目录
头发很多的程序员:『师父,这个批量处理接口太慢了,有什么办法可以优化?』
架构师:『试试使用多线程优化』
第二天
头发很多的程序员:『师父,我已经使用了多线程,为什么接口还变慢了?』
架构师:『去给我买杯咖啡,我写篇文章告诉你』
……吭哧吭哧买咖啡去了
在实际工作中,错误使用多线程非但不能提高效率还可能使程序崩溃。以在路上开车为例:
在一个单向行驶的道路上,每辆汽车都遵守交通规则,这时候整体通行是正常的。『单向车道』意味着『一个线程』,『多辆车』意味着『多个job任务』。
单线程顺利同行
如果需要提升车辆的同行效率,一般的做法就是扩展车道,对应程序来说就是『加线程池』,增加线程数。这样在同一时间内,通行的车辆数远远大于单车道。
多线程顺利同行
然而成年人的世界没有那么完美,车道一旦多起来『加塞』的场景就会越来越多,出现碰撞后也会影响整条马路的通行效率。这么一对比下来『多车道』确实可能比『单车道』要慢。
多线程故障
防止汽车频繁变道加塞可以采取在车道间增加『护栏』,那在程序的世界该怎么做呢?
程序世界中多线程遇到的问题归纳起来就是三类:『线程安全问题』
、『活跃性问题』
、『性能问题』
,接下来会讲解这些问题,以及问题对应的解决手段。
线程安全问题
有时候我们会发现,明明在单线程环境中正常运行的代码,在多线程环境中可能会出现意料之外的结果,其实这就是大家常说的『线程不安全』。那到底什么是线程不安全呢?往下看。
原子性
举一个银行转账的例子,比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元,两个操作都成功才意味着一次转账最终成功。