死锁
程序无法访问继续运行所需资源的一种状态称为死锁。当正在运行的应用程序遇到死锁时,可能会“挂起”或停止响应。
资源例如已保存或缓存的(数据)在程序中的特定进程访问时可能会被锁定。锁定数据可以防止其他进程过早覆盖数据。如果进程或查询需要访问已锁定的数据,但锁定数据的进程不释放该锁,就可能发生死锁。
例如,以下情况会导致两个进程之间发生死锁:
- 进程 1 向进程 2 请求资源 B。
- 进程 2 运行时,资源 B 处于锁定状态。
- 进程 2 需要从进程 1 获取资源 A 才能完成运行。
- 进程 1 运行时,资源 A 处于锁定状态。
结果是,进程 1 和进程 2 互相等待对方完成。由于两个进程都必须等另一个进程完成后才能继续运行,因此就形成了死锁。
避免死锁
开发者可以在编程逻辑中避免锁定条件,从而防止死锁。例如,不让两个进程相互依赖,而是编写源代码,使每个线程都在线程所需的资源被另一个线程使用前完成运行。通过确保数据在需要时可以访问,程序员可以防止应用程序挂起或崩溃。
NOTE: 在数据库上运行两个或更多查询时,也可能发生死锁。事务型数据库会锁定活动记录,防止其他查询访问这些记录。如果进程无法访问已锁定的记录,就可能发生数据库死锁。
测试你的知识