开发者社区> 问答> 正文

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

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

展开
收起
游客pklijor6gytpx 2019-12-09 15:58:19 1472 0
1 条回答
写回答
取消 提交回答
  • 当两个或多个线程在等待彼此释放所需的资源(锁定)并陷入无限等待即是死锁。它仅在多任务或多线程的情况下发生。

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

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

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

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

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

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

    这是我的版本之一

    /**
     * Java 程序通过强制循环等待来创建死锁。
     *
     *
     */
    public class DeadLockDemo {
    
        /*
         * 此方法请求两个锁,第一个字符串,然后整数
         */
         public void method1() {
            synchronized (String.class) {
                System.out.println("Aquired lock on String.class object");
    
                synchronized (Integer.class) {
                    System.out.println("Aquired lock on Integer.class object");
                }
            }
        }
    
    
        /*
         * 此方法也请求相同的两个锁,但完全
         * 相反的顺序,即首先整数,然后字符串。
         * 如果一个线程持有字符串锁,则这会产生潜在的死锁
         * 和其他持有整数锁,他们等待对方,永远。
         */
         public void method2() {
            synchronized (Integer.class) {
                System.out.println("Aquired lock on Integer.class object");
    
                synchronized (String.class) {
                    System.out.println("Aquired lock on String.class object");
                }
            }
        }
    }
    

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

    2019-12-09 15:59:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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