
一、什么是上下文切换?
即使只有一个CPU核心,它也能“同时”运行多个线程。秘诀就是时间片轮转。
-
CPU把时间切成很小的时间片(通常几十毫秒),分给每个线程。
-
线程A用完时间片后,CPU会保存A当前的状态(寄存器、程序计数器等),然后切换到线程B。
-
等下次再轮到A时,CPU会恢复之前保存的状态,让A继续执行。
这个“保存 → 切换 → 恢复”的过程,就叫一次上下文切换。
单次上下文切换的时间开销大约 小于1毫秒,虽然看似不大,但频繁切换累积起来就很可观了。
即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。时间开销略小于1ms
二、单核 vs 多核:哪种场景更快?、

单核场景第一个更快(第二个有上下文切换),多核场景第二个更快
单核情况下,不管数量多大,串行一定最快,多核情况下,数量少,串行快,数量多,并行快
三、那多线程到底开多少个合适?
没有固定答案,取决于:
-
服务器配置(CPU核心数、内存)
-
任务类型(CPU密集型 vs IO密集型)
-
实际压测结果
📌 一般通过多次性能测试得出一个范围,比如:“在我们当前8核服务器上,处理这个业务时,线程数在 50~80 之间性能最佳。”
切记:永远不要回答一个固定数字,要强调“需要根据实际情况测试”。
四、什么时候该用多线程?
核心原则:当CPU浪费比例(执行时间:等待时间)严重的情况下,适合用多线程。
举个例子:
-
一个线程执行任务时,计算只占10%的时间,等待网络/磁盘占90%。
-
如果只用单线程,那90%的时间CPU都在闲着。
-
用多线程,可以在等待时切换到其他线程干活,提高CPU利用率。
✅ 结论:执行时间 / 等待时间 比值越低,越适合用多线程。
五、上下文切换次数怎么测?

六、如何减少上下文切换?

通常来说,性能最佳是指线程数量合适以及上下文切换合适
七、加锁相关知识点
| 要点 | 说明 |
|---|---|
| 锁只能锁引用类型 | 不能锁基本类型(如 int、boolean) |
sleep() 会让出CPU | 但不会释放锁,其他线程依然无法进入同步块 |
| 加锁失败进入阻塞队列 | 进入阻塞状态后,不会被OS调度选中,直到锁被释放 |
八、如何避免死锁?

5413



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



