死锁发生:两个或多个线程之间,互相持有对方需要的锁,而永久处于阻塞状态

一、手写死锁代码:

public class DeadLockSample extends Thread {
private String first;
private String second; public DeadLockSample(String name, String first, String second) {
super(name);
this.first = first;
this.second = second;
} @Override
public void run() {
synchronized (first) {
System.out.println(this.getName() + " obtained:" + first);
try {
TimeUnit.SECONDS.sleep(1);
synchronized (second){
System.out.println(this.getName() + " obtained:" + second);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException{
String lockA = "lockA";
String lockB = "lockB";
DeadLockSample deadLockSample1 = new DeadLockSample("thread1",lockA,lockB);
DeadLockSample deadLockSample2 = new DeadLockSample("thread2",lockB,lockA);
deadLockSample1.start();
deadLockSample2.start();
deadLockSample1.join();
deadLockSample2.join(); }
}

二、死锁产生的四个条件:
互斥:共享资源X和Y只能被一个线程占用
占有且等待:线程T1已经获取共享资源X,在等待共享资源Y的时候,不释放共享资源X
不可抢占:其他线程不能强行抢占线程T1占有的资源
循环等待:线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,这就是循环等待。

三、死锁定位:

jps -l

jstack pid

Found one Java-level deadlock:
=============================
"thread2":
waiting to lock monitor 0x00007fa34c016148 (object 0x00000007957fc7d0, a java.lang.String),
which is held by "thread1"
"thread1":
waiting to lock monitor 0x00007fa34c016358 (object 0x00000007957fc808, a java.lang.String),
which is held by "thread2" Java stack information for the threads listed above:
===================================================
"thread2":
at com.example.demo.javaLession.lession18.DeadLockSample.run(DeadLockSample.java:41)
- waiting to lock <0x00000007957fc7d0> (a java.lang.String)
- locked <0x00000007957fc808> (a java.lang.String)
"thread1":
at com.example.demo.javaLession.lession18.DeadLockSample.run(DeadLockSample.java:41)
- waiting to lock <0x00000007957fc808> (a java.lang.String)
- locked <0x00000007957fc7d0> (a java.lang.String) Found 1 deadlock.

四、预防死锁:

破坏占有且等待条件:保证一次申请所有的资源。

破坏不可抢占条件:synchronized无法做到,synchronized申请不到资源直接进入阻塞状态。

java.util.concurrent Lock可以解决此问题

破坏循环等待条件:需要对资源进行排序,然后按序申请资源

五、修复死锁

发生死锁无法在线解决,必须重启,修正程序本身的问题

java面试-死锁产生、定位分析和修复的更多相关文章

  1. Java中死锁的定位与修复

    死锁应该可以说是并发编程中比较常见的一种情况,可以说如果程序产生了死锁那将会对程序带来致命的影响:所以排查定位.修复死锁至关重要: 我们都知道死锁是由于多个对象或多个线程之间相互需要对方锁持有的锁而又 ...

  2. Java面试& HashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端.  数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O( ...

  3. Java:死锁编码及定位分析

    Java:死锁编码及定位分析 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 概念 死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象, ...

  4. Java线程死锁查看分析方法

    如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...

  5. 如何分析Java虚拟机死锁

    Thread Dump and Concurrency Locks Thread dumps are very useful for diagnosing synchronization relate ...

  6. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

  7. Java面试系列

    如果你的面试简历是如下这样写的,请务必准备回答下面的所有问题. 面试职位:Java高级工程师 专业技能: (1)牢固掌握Java基础知识,如集合.并发.I/O等,并对Java源码有一定的研究. (2) ...

  8. java面试笔试大汇总

    java面试笔试题大汇总5 JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象:2.继承:3.封装:4. 多态性: 2.String是最基本的数据类型吗? 基本数据类型包括byte.int. ...

  9. Java面试宝典

    相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消 ...

随机推荐

  1. NGK和USDN的应用

    一.NGK和USDN的发展方向 目前区块链将会朝着两个方向去发展,第一种是金融经济的衍生品,第二种是商业应用,快速支付的货币体系,NGK.IO公链是基于分布式应用设计的商用金融区块链操作系统,通过数字 ...

  2. .NET探索模型路由约定实现伪静态

    概述 IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空 ...

  3. C++算法代码——卡片游戏

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?cid=1397&pid=2 题目描述 桌上有一叠牌,从第一张牌(即位于顶面的牌)开始 ...

  4. c# 打印面单

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { ...

  5. vscode好用插件总结

    做个记录:https://blog.csdn.net/xishining/article/details/90819481 1.Auto Rename Tag --自动重命名成对的HTML标记.假如你 ...

  6. vue的el-select标签全选以及出现需要有禁用选项

    首先说一下遇到这种问题的解决思路吧,很简单先去https://element.eleme.cn/#/zh-CN 这个官网上找到对应的需求,然后就是拼接数据的问题. 以下是全选的例子: <el-s ...

  7. Docker 概述(一)

    1-1 虚拟化技术发展史 在虚拟化技术出现之前,如果我们想搭建一台服务器,我们需要做如下的工作: 购买一台硬件服务器:在硬件服务器上安装配置操作系统系统:在操作系统之上配置应用运行环境:部署并运行应用 ...

  8. 注册 Amazon Web Services(AWS) 账号,助园一臂之力

    感谢大家去年的大力支持,今年园子继续和 Amazon Web Services(AWS) 合作,只要您通过 博客园专属链接 注册一个账号(建议使用手机4G网络注册),亚马逊就会给园子收入,期待您的支持 ...

  9. E: Some index files failed to download. They have been**

    转: E: Some index files failed to download. They have been** 问题描述: 当使用Dockerfile从包含cuda的镜像建立新的image的时 ...

  10. LeetCode-重建二叉树(前序遍历+中序遍历)

    重建二叉树 LeetCode-105 首次需要知道前序遍历和中序遍历的性质. 解题思路如下:首先使用前序比遍历找到根节点,然后使用中序遍历找到左右子树的范围,再分别对左右子树实施递归重建. 本题的难点 ...