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

本文介绍了Java并发编程中应注意的三个关键问题:上下文切换带来的额外开销,如何减少上下文切换,以及并发不当可能导致的死锁问题及其解决方案。此外,还探讨了计算机资源如何限制并发,并提出了避免资源限制的方法。
175

被折叠的 条评论
为什么被折叠?



