本文最后更新于50 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
CPU通过时间片分配算法来循环执行线程任务,当前任务执行一个时间片后会切换到下一个线程任务。此时,切换前会保存上一个任务的状态,以便于下一次切换回这个任务时,能再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
上下文切换回影响多线程的执行速度,因此减少线程之间上下文切换会是一个优化方向。常用的方法有:
- 无锁并发编程:多线程竞争锁时,会引起上下文切换(因为线程在竞争锁时会暂时挂起,而切换线程)。因此可以通过一些方法避免使用锁,比如将数据ID根据Hash算法取模分段,不同线程处理不同段的数据。
- CAS算法:Java的Atomic使用CAS算法来更新数据,不需要加锁
- 使用最少线程:避免创建不需要的线程,比如任务少,但创建了大量线程处理,会导致线程处于等待状态