美文网首页
Java 死锁 以及实例

Java 死锁 以及实例

作者: 博弈史密斯 | 来源:发表于2018-07-05 10:03 被阅读0次

先看一个死锁的代码:

public class ClassB {
    
    private static ClassB instance;
    
    public static ClassB getInstance() {
        if (instance == null) {
            instance = new ClassB();
        }
        return instance;
    }

    public synchronized void b1() {
        ...
    }
    
    public synchronized void b2() {
        Thread.sleep(2000);
        
        ClassA.getInstance.a2();
    }
}

public class ClassA {
    
    private static ClassA instance;
    
    public static ClassA getInstance() {
        if (instance == null) {
            instance = new ClassA();
        }
        return instance;
    }

    public synchronized void a1() {
        ClassB.getInstance.b1();
    }
    
    public synchronized void a2() {
        ...
    }
}

Thread thread1 = new Thread() {

    @Override
    public void run() {
        ClassA.getInstance.a1();
    }
};

Thread thread2 = new Thread() {

    @Override
    public void run() {
        ClassB.getInstance.b2();
    }
};

//Main 方法中:
thread2.start();
thread1.start();

先启动 thread2,thread2 中调用ClassB 的 b2,b2 中先睡了两秒,然后调用a2;
再启动 thread1,thread1 中调用ClassA 的 a1,a1 中调用 b1;

a1 调用 b1 时,因为 b2 在 sleep,没有释放锁,所以a1 等待 b2 释放锁
b2 sleep 时间过后,调用 a2,而 a1 这时还在执行,没有释放锁,所以 b2 也在等待 a1 释放锁

所以就出现了 ClassA 等待 ClassB 释放锁,而 ClassB 也在等待 ClassA 释放锁 的无限等待的情况。
这种情况便称为 死锁。

用一副图来标识上面的调用关系:


上面的代码是 两个类 互相调用:A->B->A->B...,产生死锁。
而实际中的死锁有可能更隐蔽,有可能是 A->B->C->A->B... 的情况,形成闭环,有可能闭环中的类更多。

死锁的根本原因是出现了嵌套锁,要避免嵌套锁的发生,下面给出一种解决方式:

public void b2() {

    synchronized(this) {
        Thread.sleep(2000);
    }
    
    ClassA.getInstance.a2();
}

synchronized 不再修饰方法,而是修饰一个代码块,调用 a2 不放在代码块中。
这样便断开了锁链,不能形成死锁了。

下面给出一个 trace 文件中的死锁的日志:


重点看 第8行 和 第23行,thread1 等待 thread14 ,thread14 在等待 thread1,形成死锁。

相关文章

  • Java 死锁 以及实例

    先看一个死锁的代码: 先启动 thread2,thread2 中调用ClassB 的 b2,b2 中先睡了两秒,然...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

  • Java--死锁以及死锁的排查

    最近遇到了死锁的问题,所以这里分析并总结下死锁,给出一套排查解决方案。 死锁示例一 清单一 清单一代码有点长,但是...

  • java,中加锁以及死锁

    synchronized(加同一个对象)在创建多个多线程的时候,线程间就不会相互抢夺资源,抢夺资源,抢夺资源的坏处...

  • 多线程

    实例:实时播放可以用到死锁:互斥锁+信号量:---》出现死锁互斥锁+条件量:---》不会死锁 。

  • java多线程死锁简单实例

    TestDeadLock.java:package com.ctgu.testDeadLock; public c...

  • Java死锁检测之ThreadMXBean

    看此文章前请先了解之前一篇文章 "Java死锁之理解死锁" 中的死锁示例java 中提供了可以检测死锁的工具类Th...

  • Java concurrency《防止死锁》

    Java concurrency《防止死锁》 常见预防死锁的办法 有顺序的锁 具有超时时间的锁 死锁的检测 有顺序...

  • 如何去检测死锁

    如何检测死锁 死锁预防 让线程获取锁的顺序一致 死锁检测 jps 查看java 进程信息 jstack +进程号 ...

  • Java 实例

    Java 环境设置实例 Java 实例 – 如何编译一个Java 文件? Java 实例 – Java 如何运行一...

网友评论

      本文标题:Java 死锁 以及实例

      本文链接:https://www.haomeiwen.com/subject/gnpuuftx.html