开发者社区> 问答> 正文

编写Java程序时,如何在Java中创建死锁并修复它?

编写Java程序时,如何在Java中创建死锁并修复它?

展开
收起
珍宝珠 2020-02-07 17:01:36 1371 0
1 条回答
写回答
取消 提交回答
  • 如何检测Java中的死锁?

    虽然这可以有很多答案,但我的版本是首先我会看看代码,如果我看到一个嵌套的同步块,或从一个同步的方法调用其他同步方法,或试图在不同的对象上获取锁,如果开发人员不是非常小心,就很容易造成死锁。

    另一种方法是在运行应用程序时实际锁定时找到它,尝试采取线程转储,在Linux中,你可以通过kill-3命令执行此操作,这将打印应用程序日志文件中所有线程的状态,并且你可以看到哪个线程被锁定在哪个线程对象上。

    你可以使用fastthread.io网站等工具分析该线程转储,这些工具允许你上载线程转储并对其进行分析。

    另一种方法是使用jConsole或VisualVM,它将显示哪些线程被锁定以及哪些对象被锁定。

    如果你有兴趣了解故障排除工具和分析线程转储的过程,我建议你看看UriahLevy在多元视觉(PluraIsight)上《分析Java线程转储》课程。旨在详细了解Java线程转储,并熟悉其他流行的高级故障排除工具。

    编写一个将导致死锁的Java程序?

    一旦你回答了前面的问题,他们可能会要求你编写代码,这将导致Java死锁。

    这是我的版本之一

    image.png

    如果method1()和method2()都由两个或多个线程调用,则存在死锁的可能性,因为如果线程1在执行method1()时在Sting对象上获取锁,线程2在执行method2()时在Integer对象上获取锁,等待彼此释放Integer和String上的锁以继续进行一步,但这永远不会发生。

    image.png

    此图精确演示了我们的程序,其中一个线程在一个对象上持有锁,并等待其他线程持有的其他对象锁。

    你可以看到,Thread1需要Thread2持有的Object2上的锁,而Thread2希望获得Thread1持有的Object1上的锁。由于没有线程愿意放弃,因此存在死锁,Java程序被卡住。

    其理念是,你应该知道使用常见并发模式的正确方法,如果你不熟悉这些模式,那么JosePaumard《应用于并发和多线程的常见Java模式》是学习的好起点。

    2020-02-07 17:05:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载