参考 : <<Java 并发编程的艺术>> -方腾飞 魏鹏 程晓明
无论是单机还是分布式环境,多线程无处不在,
如果用人来比作线程的话,一个公司不可能只有一个人,一个团队不可能只有一个人
1.那么多线程一定是快的吗?
为什么会有这个疑问?
难道多个人一起来做某件事情效率还比不上一个人吗?
我们来看 cpu对于多线程的处理机制:
cpu通过时间分片法来循环执行任务,cpu定好一个固定的时间片,在这个时间片内执行线程的任务。如果在时间片内任务未执行完成,则会保存当前线程的状态,然后切到另外一个任务(线程)。
从当前任务在时间片内未执行完成到cpu保存当前任务状态,再到切换回这个任务的过程就是一次上下文切换
上下文切换会给cpu带来一定效率上的损失,影响多线程的执行速度
回到问题1,书中给出的demo只是对数字进行累加。
得出结论
百万次以下的操作中,并发执行速度回比串行执行累加的速度慢。
相对于累加这种比较简易的操作,实际项目中线程中执行的任务可能更加复杂,查询,排序,通信之类,这种情况多线程一般会更加快速
2.如何减少上下文切换?
- 无锁并发编程
- CAS算法
- 使用最少线程
- 协程,在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换