并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题:
- 上下文切换
- 死锁
- 资源限制
接下来会逐一分析这三个问题,并给出相应的解决方案。
问题一:上下文切换会带来额外的开销
线程的运行机制
- 一个CPU每个时刻只能执行一条线程;
- 操作系统给每条线程分配不同长度的时间片;
- 操作系统会从一堆线程中随机选取一条来执行;
- 每条线程用完自己的时间片后,即使任务还没完成,操作系统也会剥夺它的执行权,让另一条线程执行
什么是“上下文切换”?
当一条线程的时间片用完后,操作系统会暂停该线程,并保存该线程相应的信息,然后再随机选择一条新线程去执行,这个过程就称为“线程的上下文切换”。
上下文切换的过程
- 暂停正在执行的线程;
- 保存该线程的相关信息(如:执行到哪一行、程序计算的中间结果等)
- 从就绪队列中随机选一条线程;
- 读取该线程的上下文信息,继续执行
上下文切换是有开销的
每次进行上下文切换时都需要保存当前线程的执行状态,并加载新线程先前的状态。 <