死锁起因:
死锁是指两个或多个进程在执行过程中,由于竞争资源而造成的一种互相等待的现象,若无外力干涉,它们将一直等下去,不会再有任何进展,系统处于一种僵局状态。
死锁的四个必要条件:
互斥
:一个资源只能被一个进程使用。占有且等待
:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不可抢占
:进程已获得的资源在未使用完之前,不能被其他进程强行夺走。循环等待
:若干进程之间形成一种头尾相接的循环等待关系。
解决方法:
预防死锁
:通过避免死锁的四个必要条件,来防止死锁的发生。避免死锁
:当系统发现可能发生死锁时,采取措施阻止死锁的发生。检测死锁
:当系统发现已经发生死锁时,采取措施恢复系统。
在对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。例如,进程 A 先锁表 A,再锁表 B,进程 B 先锁表 B,再锁表 A,则会发生死锁。
避免死锁:
使用乐观锁
:乐观锁假设不会发生冲突,在更新数据时,不加锁,而是在提交更新时,检查是否有其他进程修改了数据,如果有,则回滚更新。使用悲观锁
:悲观锁假设会发生冲突,在更新数据时,先加锁,然后再更新数据。使用两阶段锁协议
:两阶段锁协议是一种避免死锁的算法,它将锁的申请分为两阶段:获取阶段和释放阶段。在获取阶段,进程可以申请多个锁,但不能释放任何锁;在释放阶段,进程必须释放它已获得的所有锁。