为什么java不能从死锁中恢复?

为什么java不能从死锁中恢复?,java,multithreading,jvm,Java,Multithreading,Jvm,我正在阅读《Java并发实践》一书,下面是它对死锁的描述 JVM不能从死锁中恢复,这是摆脱死锁的唯一方法 锁定是为了重新启动服务器。它还提到JVM使用图形 搜索线程作为图形节点和两个线程之间的边的位置A B被定义为线程A正在等待资源锁定 由线程B持有。此图是有方向的,如果在 这个图,那么就有死锁了 现在我的问题是,如果JVM知道存在死锁,那么为什么它不杀死一个线程而让另一个继续呢?这背后有什么具体原因,或者我的问题本身是基于错误的结论 请让我知道你对此的看法。提前感谢 现在我的问题是,如果JVM

我正在阅读《Java并发实践》一书,下面是它对死锁的描述

JVM不能从死锁中恢复,这是摆脱死锁的唯一方法 锁定是为了重新启动服务器。它还提到JVM使用图形 搜索线程作为图形节点和两个线程之间的边的位置A B被定义为线程A正在等待资源锁定 由线程B持有。此图是有方向的,如果在 这个图,那么就有死锁了

现在我的问题是,如果JVM知道存在死锁,那么为什么它不杀死一个线程而让另一个继续呢?这背后有什么具体原因,或者我的问题本身是基于错误的结论

请让我知道你对此的看法。提前感谢

现在我的问题是,如果JVM知道存在死锁,那么为什么它不杀死一个线程而让另一个继续呢?这背后有什么具体原因,或者我的问题本身是基于错误的结论

JVM如何决定杀死哪个线程?如果JVM在强制释放锁的过程中允许无效数据进入某种关键数据库,该怎么办

JVM不能随意做出此类决策。它报告死锁,但无法自动从死锁中恢复

在使用锁修改两个关键对象但两个线程以不同顺序锁定它们的任何情况下,您都可以看到这个问题。数据库事务能够从这种死锁中恢复,因为它们被设计为回滚表和索引,但Java同步锁没有隐式内存回滚功能。通过杀死一个线程并释放其锁,JVM将允许传播部分内存更新

现在我的问题是,如果JVM知道存在死锁,那么为什么它不杀死一个线程而让另一个继续呢?这背后有什么具体原因,或者我的问题本身是基于错误的结论

JVM如何决定杀死哪个线程?如果JVM在强制释放锁的过程中允许无效数据进入某种关键数据库,该怎么办

JVM不能随意做出此类决策。它报告死锁,但无法自动从死锁中恢复


在使用锁修改两个关键对象但两个线程以不同顺序锁定它们的任何情况下,您都可以看到这个问题。数据库事务能够从这种死锁中恢复,因为它们被设计为回滚表和索引,但Java同步锁没有隐式内存回滚功能。通过杀死一个线程并释放其锁,JVM将允许传播部分内存更新。

杀死一个线程将不允许另一个线程正常运行。事实上,杀死线程将是致命的。线程首先获得锁的原因是,当某个数据结构处于不一致状态时,将其他线程排除在该数据结构之外。在数据结构仍处于不一致状态的情况下释放锁将严重污染流程上下文

例如:

  • 线程锁定对象1

  • 线程B锁定对象2

  • 线程A将对象1置于不一致的状态

  • 线程B将对象2置于不一致的状态

  • 在对象2上穿过一个块

  • 对象1上的线程B块

  • 两个线程现在如何继续?每个线程都在等待另一个线程将对象返回到一致状态

    这里有一个更清楚的例子,以防你不明白我所说的不一致状态是什么意思。考虑这个代码:

  • 获取保护
    foo
    bar
    的锁
  • 如果
    foo
    plus
    bar
    不是10,就开始第三次世界大战。(不用担心,程序员小心地确保
    foo
    bar
    始终为10,除非他真的要发动第三次世界大战。)
  • 增量
    foo
  • 获取其他锁
  • 减量
    bar
  • 松开另一个锁
  • 松开保护
    foo
    bar
    的锁

  • 如果在第4步出现死锁,您会怎么做?您无法释放保护
    foo
    bar
    的锁,因为运行此代码的下一个线程将启动第三次世界大战。显然,需要详细了解此特定代码的作用才能解开死锁。

    杀死一个线程将不允许另一个线程正常运行。事实上,杀死线程将是致命的。线程首先获得锁的原因是,当某个数据结构处于不一致状态时,将其他线程排除在该数据结构之外。在数据结构仍处于不一致状态的情况下释放锁将严重污染流程上下文

    例如:

  • 线程锁定对象1

  • 线程B锁定对象2

  • 线程A将对象1置于不一致的状态

  • 线程B将对象2置于不一致的状态

  • 在对象2上穿过一个块

  • 对象1上的线程B块

  • 两个线程现在如何继续?每个线程都在等待另一个线程将对象返回到一致状态

    这里有一个更清楚的例子,以防你不明白我所说的不一致状态是什么意思。考虑这个代码:

  • 获取保护
    foo
    bar
    的锁
  • 如果
    foo
    plus
    bar
    不是10,就开始第三次世界大战。(不用担心,程序员小心地确保
    foo
    bar
    始终为10,除非他真的要发动第三次世界大战。)
  • 增量
    foo
  • 获取其他锁
  • 减量