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

一、手写死锁代码:

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. flat array

    flat array 已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 1 ...

  2. html 布局,上下各100px,中间自适应

    flex <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  3. js 斩掉单行注释和多行注释

    var json = ` // e { /* hello */ name:/* a */ 'ajanuw' // c /** * * hello * ? adsd * todo */ // c } ` ...

  4. NGK公链存储技术,如何开创应用落地新格局?

    尽管无人预测未来,但是资本的眼光总是那么灵敏,最近几年,国际资本市场纷纷将目光投到了公链市场上.从TPS高点备受抢占,再到DApp生态的不断涌现,再到目前Staking和Defi的新概念生态的不断发力 ...

  5. 对DevOps的九大误解,是时候纠正了!

    DevOps是开发和运维的结合,有助于集成和自动化测试过程以及部署存储库,还提供了透明度以及灵活性.DevOps的目标如下: ●更快的上市时间(TTM). ●减少各种修复之间的前置时间.●提高部署频率 ...

  6. where & having 关键字

    where和having都是做条件筛选的 where执行的时间比having要早 where后面不能出现组函数 having后面可以出现组函数 where语句要跟在from后面 ,where 不能单独 ...

  7. 微信小程序:picker组件实现下拉框效果

    一.wxml中代码 <view class="in_order_Param">             <text>状态:</text>     ...

  8. 微信小程序:数据绑定

    data中的数据不仅仅可以当成文本来显示,还可以当成属性来显示. 注意:属性值要用单引号或双引号引起来. 在微信开发者工具的控制台中点击Wxml会看到 使用Boolean类型充当属性的时候,字符串和花 ...

  9. 后端程序员之路 8、一种内存kv数据库的实现

    键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织.索引和存储.KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘 ...

  10. MySQL:安装与配置

    记录一次 MySQL 在Windows系统的安装配置过程 安装MySQL 0.下载社区版安装包 官网下载地址:https://dev.mysql.com/downloads/installer/ 1. ...