第二季:10.死锁编码及定位分析【Java面试题】

简介: 第二季:10.死锁编码及定位分析【Java面试题】

前言


2022 10/11 20:27

路漫漫其修远兮,吾将上下而求索


本文是根据尚硅谷学习所做笔记

仅供学习交流使用,转载注明出处

推荐

尚硅谷Java大厂面试题第2季,面试必刷,跳槽大厂神器

第二季大佬总结

10.死锁编码及定位分析

说明

本文目录前是相关视频的名字和具体视频中思维导图的名字

题目

10.死锁编码及定位分析

55 死锁编码及定位分析

是什么

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,往无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。



产生死锁主要原因

  • 系统资源不足
  • 进程运行推进的顺序不合适
  • 资源分配不当

代码

package deadlock10;
import java.util.concurrent.TimeUnit;
class HoldLockThread implements Runnable{
    private String lockA;
    private String lockB;
    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }
    @Override
    public void run() {
        synchronized (lockA){
            System.out.println(Thread.currentThread().getName()+"\t 自己持有"+lockA+"\t 尝试获得:"+lockB);
            //tsleep
            try{ TimeUnit.SECONDS.sleep(2); }catch (InterruptedException e){ e.printStackTrace(); }
            synchronized (lockB){
                System.out.println(Thread.currentThread().getName()+"\t 自己持有"+lockB+"\t 尝试获得:"+lockA);
            }
        }
    }
}
/**
 * @author CSDN@日星月云
 * @date 2022/10/11 20:35
 *
 * 死锁是指两个或两个以上的进程在执行过程中,
 * 因争夺资源而造成的一种互相等待的现象,
 * 往无外力干涉那它们都将无法推进下去,
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA="lockA";
        String lockB="lockB";
        new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start();
        new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start();
    }
}
ThreadAAA  自己持有lockA   尝试获得:lockB
ThreadBBB  自己持有lockB   尝试获得:lockA

解决

jsp命令定位进程号

jstack找到死锁查看

E:\IdeaProjects\JavaMS\second>jps -l
16368 org.jetbrains.jps.cmdline.Launcher
18932 deadlock10.DeadLockDemo
16168
16652 sun.tools.jps.Jps
E:\IdeaProjects\JavaMS\second>jstack 18932
...
Java stack information for the threads listed above:
===================================================
"ThreadBBB":
        at deadlock10.HoldLockThread.run(DeadLockDemo.java:23)
        - waiting to lock <0x00000000d8e0f298> (a java.lang.String)
        - locked <0x00000000d8e0f2d0> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:745)
"ThreadAAA":
        at deadlock10.HoldLockThread.run(DeadLockDemo.java:23)
        - waiting to lock <0x00000000d8e0f2d0> (a java.lang.String)
        - locked <0x00000000d8e0f298> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.

最后


2022 10/11 20:55


p55


Markdown 2351 字数 154 行数

HTML 2096 字数 89 段落


相关文章
|
9月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
279 4
|
8月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
7月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
341 2
|
7月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
318 1
|
8月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
8月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
9月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?