01-什么是多线程上下文切换与多线程死锁的解决办法
2019-04-04 21:39
155 查看
1.上下文
1-1.什么是上下文切换
在单核cpu中,多线程的执行是通过cpu的时间片分配,每个线程会分配到一个时间片,循环执行这些线程,线程时间片消耗完了就会进入等待状态,直到分配到新的时间片,因为时间片的时间非常短,所以cpu不停的切换线程执行,给我们造成了多线程同时运行的错觉。
cpu通过时间片循环执行线程任务,当线程的cpu时间片用完后会保存当前任务状态,方便下次获取到cpu时间片的时候能继续执行,当下次分配时间片后执行到该线程时,会重新加载该线程的任务状态,而这个从保存任务状态到重新加载的过程就叫上下文换。
1-2.上下文切换会带来什么影响
每次上下文切换也都要消耗cpu资源的,就好比看英文书一样,你边英文看边去看翻译,在你看翻译之前你必须要记住当前英文书看到了第几页,这样的切换是会影响读书的效率,同样上下文切换也会影响多线程的执行速度。
- 当前线程在时间片使用完前执行完毕,cpu进行线程切换,不会造成cpu资源浪费。
1-3.线程多不一定代表快
线程多不一定代表程序运行速度会快,因为线程的创建每次的上下文切换都会消耗cpu资源。举个例子,迅雷下载你单线程全速是10M,你开10个任务同时下载,每个任务的平均下载速度可能只有600-700KB,为什么会这样?因为每个线程得到的cpu资源是分散的,每个线程去获取第三方资源的时候效率没有那么高,而且cpu分散的也不是总资源,它有一部资源可能浪费在线程创建与每次上下文切换了,剩下3M-4M资源就体现在这其中。
1-4.减少上下文切换
- 无锁并发编程:因为每次锁的竞争都会引起上下文切换
- CAS算法:CAS算法是一种替代锁的方式,不需要加锁也能达到原子性(我更愿意说数据的一致性)
- 协程:一种比线程还要小的执行单位,能在单线程中进行多任务切换。
请大家一定要根据不同的业务场景合理的使用线程数量。
2.死锁
2-1什么是死锁
死锁是指两个或多个线程以上,当前线程拥有其他线程需要的资源,并等待其他线程释放已拥有的资源,其他线程也是如此,都不放弃自己拥有的资源。
2-2.避免死锁
- 避免同一个线程获取多个锁的资源
- 使用定时锁,设置超时时间
参考:
《Java并发编程的艺术》
相关文章推荐
- 【Java多线程】死锁范例及解决办法
- JAVA多线程基础 之二 什么是线程安全及解决办法
- 什么是线程锁,什么是死锁,解决死锁的办法。
- 什么是死锁及死锁产生条件和解决办法
- 多线程死锁及解决办法
- 什么是线程锁和进程锁?什么是死锁,死锁产生的原因和解决锁的办法
- windows下的多线程死锁的彻底解决办法
- 多线程加强(三)线程死锁的两种情况及解决办法
- 记一次公司仓库数据库服务器死锁过程及解决办法
- 死锁的例子以及解决办法
- 用存储过程查出引起死锁的进程和SQL语句--数据库死锁原因及解决办法
- ubuntu11安装qt-x11-opensource-src-4.5.3.tar.gz错误解决办法01
- DB2死锁解决办法
- Java多线程产生死锁的条件以及解决方法
- ASP.NET Identity V2在多线程中UserManager获取的httpContext.Current始终为null的解决办法
- Android线程—多线程之死锁解决办法
- 银行家算法:解决多线程死锁问题
- 什么是死锁及死锁的必要条件和解决方法【转】
- 多线程并发导致CPU100%的一种原因和解决办法
- winform 多线程中ShowDialog()步骤无效的解决办法