上下文切换 VS 死锁

什么是上下文切换?

在多线程中,因为CPU一次只能处理一个线程,为了实现多线程同时执行的效果(当然是一种错觉,但是不需要同步),所以就出现了多线程轮流分配CPU时间片的情况,这种情况称为上下文切换。

上下文切换的过程需要保存上一个上下文的环境状态到寄存器中,等到切换回来的时候可以方便的恢复成原来的现场。

如何减少上下文切换?

1)分段加锁。比如使用分段锁,不同的线程处理不同段的数据;

2)CAS算法。用循环CAS操作来更新数据,而不需要加锁;

3)使用最少线程;使用协程。

什么是死锁?

死锁是指两个线程互相持有对方需要的资源而不释放的互相等待的过程,比如线程A持有线程B需要的锁1,线程B持有线程A需要的锁2,但二者都不主动释放自己持有的锁,因此造成了互相循环等待的情况,死锁直接导致了服务的不可用,是对应用的一个很大的危害。可以通过dump线程来分析是哪里出了错。

如何避免死锁?

1)避免一个线程同时获取多个锁;

2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源;

3)使用定时锁,比如lock.tryLock(timeout)来替代使用内部锁机制;

4)对于数据库锁,加锁和解锁都必须在一个数据库连接里,否则会出现解锁失败的情况。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181204G1I62U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券