Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JVM在检测到运行时异常时不阻止死锁?_Java_Multithreading_Deadlock - Fatal编程技术网

Java 为什么JVM在检测到运行时异常时不阻止死锁?

Java 为什么JVM在检测到运行时异常时不阻止死锁?,java,multithreading,deadlock,Java,Multithreading,Deadlock,Java可以检测即将发生的死锁(或者至少在某些情况下) 例如,考虑以下内容: Thread A acquires Lock A Thread B acquires Lock B Thread A tries to acquire Lock B - and blocks Thread B tries to acquire Lock A - and blocks indefinitely 在最后一条语句中,JVM知道它将以死锁结束(因为它知道哪个线程持有哪个锁) 所以我的问题是,为什么JVM不会在

Java可以检测即将发生的死锁(或者至少在某些情况下)

例如,考虑以下内容:

Thread A acquires Lock A
Thread B acquires Lock B
Thread A tries to acquire Lock B - and blocks
Thread B tries to acquire Lock A - and blocks indefinitely
在最后一条语句中,JVM知道它将以死锁结束(因为它知道哪个线程持有哪个锁)

所以我的问题是,为什么JVM不会在锁获取时抛出运行时错误,从而导致死锁,导致线程终止(就像任何其他未处理的异常一样),并再次像正常情况一样释放其锁

例如,在数据库中,如果一个事务试图锁定某个记录,而数据库发现它将被死锁,则该事务将被中止。
同样的方法也可以应用于线程,为什么不呢?

这是一个好问题,我认为jvm设计人员将处理非法状态的责任留给了开发人员。这些协议并不意味着要处理不正确的编程以及超出其范围的业务逻辑的后果。在我看来,这可能是一个很好的非默认配置选项。@MarianP是的,但在不拿显示器的情况下尝试调用wait()也是如此。在这种情况下,将抛出非法MonitorStateException。无论如何,死锁会导致两个或多个线程挂起,一旦达到这种状态,开发人员将无法对其执行任何操作。好的,也许问题在于定义死锁。它可能仅由外部线程检测,而不是时间决定的。并不是当它发生时立即点击的东西,“JVM知道…”所有的事实都可用和知道是有区别的。JVM只能知道,如果每次任何线程试图锁定一个锁时,它首先对所有锁和所有者运行一个图搜索算法,那么最后一步将导致死锁。对于某些应用程序,性能损失太大,开发人员宁愿证明死锁是不可能的,或者在无法证明的情况下修复问题。对于本应在测试期间解决的问题,抛出异常不是很有用。死锁很容易在单个程序中避免。在分布式系统(如数据库服务器)中,它变得很困难,需要检测。