deadlock - 编程中死锁问题的发生频率如何?

标签 deadlock

我已经用多种语言进行了编程,但我不知道我的代码中存在死锁。

我认为这意味着它不会发生。

这是否经常发生(在编程中, 而不是 在数据库中)足以让我担心吗?

最佳答案

如果两个条件为真,就会出现死锁:您有多个头条,并且它们争用不止一种资源。

你会写多线程代码吗?您可以通过启动您自己的线程来明确地做到这一点,或者您可以在一个框架中工作,在该框架中线程是在您的视线之外创建的,因此您在多个线程中运行而您在代码中没有看到它。

一个例子:Java Servlet API。您编写一个 servlet 或 JSP。您部署到应用服务器。几个用户访问了您的网站,因此访问了您的 servlet。服务器可能会为每个用户设置一个线程。

现在考虑如果在服务请求时您想要获取一些资源会发生什么:

if ( user Is Important ){
     getResourceA();
}

getResourceB();

if (today is Thursday ) {
    getResourceA();
} 


// some more code

releaseResourceA();
releaseResoruceB();

在上面人为设计的示例中,考虑在星期四当重要用户的请求到达时可能会发生什么,并且或多或少同时一个不重要的用户请求到达。

重要用户的线程得到资源A,想要B。不太重要的用户得到资源B,想要A。也不会放手已经拥有的资源……死锁。

如果您正在编写显式使用同步的代码,这实际上很容易发生。最常见的是我在使用数据库时看到它发生,幸运的是数据库通常有死锁检测,所以我们可以找出我们犯了什么错误。

防止死锁:
  • 以明确定义的顺序获取资源。在上面的例子中,如果资源 A 总是在资源 B 之前获得,则不会发生死锁。
  • 如果可能,请使用超时,这样您就不会无限期地等待资源。这将允许您检测争用并应用防御 1。
  • 关于deadlock - 编程中死锁问题的发生频率如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360805/

    相关文章:

    java - ArrayList方法导致Producer Consumer死锁

    c# - 如何解决 SqlException 在锁定时死锁 |通信缓冲资源

    go - 写入 channel 永远被阻止

    ios - 核心数据死锁

    ruby-on-rails - 是什么导致 Rails 应用程序中出现 'deadlock; recursive locking' 错误?

    c# - 如何成功造成死锁

    linux - 为什么这个 C++11 程序不会死锁?

    c - 互斥实现中的死锁和竞争条件

    python - 在 python2.7 中使用 python 读写 block 打开

    sql-server - 偶尔出现死锁