上下文切换(Context Switch):一个线程被暂停剥夺使用权,另一个线程被选中开始或者继续运行的过程.
上下文是指某一时间点 CPU 寄存器和程序计数器的内容。
引起线程上下文切换的原因
- 当前执行任务的时间片用完之后,系统 CPU 正常调度下一个任务;
- 当前执行任务碰到 IO 阻塞,调度器将此任务挂起,继续下一任务;
- 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务;
- 用户代码挂起当前任务,让出 CPU 时间;
- 硬件中断;
举例说明死锁发生的场景
- 系统资源的竞争。只有资源不足时才会出现死锁可能,另外,可剥夺资源的竞争是不会引发死锁的;
- 进程推进顺序不对。多进程在运行时,请求和释放资源的顺序不当。
- 系统资源分配不当。
- 线程之间交错执行
解决:以固定的顺序加锁 - 执行某方法时就需要持有锁,且不释放
解决:缩减同步代码块范围,最好仅操作共享变量时才加锁 - 永久等待
解决:使用tryLock()定时锁,超过时限则返回错误信息 因此我们要减少上下文切换,以下概述了什么场景下设置线程池的大小
- 高并发,低耗时的情况:建议少线程,只要满足并发即可;例如并发100,线程池可能设置为10就可以;
- 低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务;例如并发10,线程池可能就要设置为20;
- 高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数;