第二季: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 段落


相关文章
|
1天前
|
存储 Java
java用base64编码案例
Java Base64编码示例:导入`java.util.Base64`,设置字符串`originalString`,使用`Base64.getEncoder().encodeToString()`编码并存储到`encodedString`,打印编码后字符串。解码用`Base64.getDecoder().decode()`。
8 0
|
1天前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
3天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
3天前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
4天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
32 1
|
4天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
4天前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
15 0
|
9天前
|
XML 缓存 Java
Java大厂面试题
Java大厂面试题
20 0
|
存储 设计模式 IDE
阿里Java编码手册实战详解-OOP规约
阿里Java编码手册实战详解-OOP规约
104 0
|
存储 安全 Java
阿里Java编码手册实战详解-集合处理篇
阿里Java编码手册实战详解-集合处理篇
101 0