您的位置:首页 > 其它

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.减少上下文切换

  1. 无锁并发编程:因为每次锁的竞争都会引起上下文切换
  2. CAS算法:CAS算法是一种替代锁的方式,不需要加锁也能达到原子性(我更愿意说数据的一致性)
  3. 协程:一种比线程还要小的执行单位,能在单线程中进行多任务切换。

  请大家一定要根据不同的业务场景合理的使用线程数量。

2.死锁

 2-1什么是死锁

  死锁是指两个或多个线程以上,当前线程拥有其他线程需要的资源,并等待其他线程释放已拥有的资源,其他线程也是如此,都不放弃自己拥有的资源。

 2-2.避免死锁

  • 避免同一个线程获取多个锁的资源
  • 使用定时锁,设置超时时间

参考:

《Java并发编程的艺术》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: