Java:死锁编码及定位分析

本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记

概念

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

产生死锁的原因

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

死锁产生的四个必要条件

互斥

  • 解决方法:把互斥的共享资源封装成可同时访问

占有且等待

  • 解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,但是这种方式会导致资源效率低。

非抢占式

  • 解决方法:如果进程不能立即分配资源,要求它不占有任何其他资源,也就是只能够同时获得所有需要资源时,才执行分配操作

循环等待

  • 解决方法:对资源进行排序,要求进程按顺序请求资源。

死锁代码

我们创建了一个资源类,然后让两个线程分别持有自己的锁,同时在尝试获取别人的,就会出现死锁现象

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); try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName() + "\t 自己持有" + lockB + "\t 尝试获取:" + lockA);
}
} }
} public class DeadLockDemo { public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB"; new Thread(new HoldLockThread(lockA, lockB), "A").start();
new Thread(new HoldLockThread(lockB, lockA), "B").start();
}
}

运行结果,main线程无法结束

A	 自己持有lockA	 尝试获取:lockB
B 自己持有lockB 尝试获取:lockA

如何排查死锁

当我们出现死锁的时候,首先需要使用jps命令查看运行的程序

jps -l

我们能看到 DeadLockDemo 这个类,一直在运行

C:\Users\ZhuCC\Desktop\Java\Code\DemoCode>jps -l
26132 DeadLockDemo
9988 org.jetbrains.jps.cmdline.Launcher
23756
26988 sun.tools.jps.Jps

在使用jstack查看堆栈信息

jstack 26132   # 后面参数是 jps输出的该类的pid

得到的结果

Found one Java-level deadlock:
=============================
"B":
waiting to lock monitor 0x0000000002d8b098 (object 0x000000076b294a98, a java.lang.String),
which is held by "A"
"A":
waiting to lock monitor 0x0000000002d8c538 (object 0x000000076b294ad0, a java.lang.String),
which is held by "B" Java stack information for the threads listed above:
===================================================
"B":
at HoldLockThread.run(DeadLockDemo.java:25)
- waiting to lock <0x000000076b294a98> (a java.lang.String)
- locked <0x000000076b294ad0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
"A":
at HoldLockThread.run(DeadLockDemo.java:25)
- waiting to lock <0x000000076b294ad0> (a java.lang.String)
- locked <0x000000076b294a98> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748) Found 1 deadlock.

通过查看最后一行,我们看到 Found 1 deadlock,即存在一个死锁

Java:死锁编码及定位分析的更多相关文章

  1. Java死锁编码及定位分析的demo

    死锁 死锁是什么 大学课程中的四个要素: (1)互斥(2)不可抢占(3)循环等待(4)请求保持 也就是下图所描述 产生死锁的主要原因 (1)系统资源不足(2)进程运行推进的顺序不合适(3)资源分配不当 ...

  2. java面试-死锁产生、定位分析和修复

    死锁发生:两个或多个线程之间,互相持有对方需要的锁,而永久处于阻塞状态 一.手写死锁代码: public class DeadLockSample extends Thread { private S ...

  3. 一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  4. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  5. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  6. Java安全之RMI协议分析

    Java安全之RMI协议分析 0x00 前言 在前面其实有讲到过RMI,但是只是简单描述了一下RMI反序列化漏洞的利用.但是RMI底层的实现以及原理等方面并没有去涉及到,以及RMI的各种攻击方式.在其 ...

  7. Java安全编码之用户输入

    0x00 安全引言 1.传统Web应用与新兴移动应用 (1)传统Web应用:浏览器 HTTP 服务器(2)新兴移动应用:APP HTTP 服务器 从安全角度看,传统Web应用与新兴移动应用没有本质区别 ...

  8. Java中json工具对比分析

    Java中几个json工具分析 1, 环境 JDK1.6+IDE(IntelliJ IDEA)+windowsXP+GBK编码 2,分析对象 jackson1.8.2 http://jackson.c ...

  9. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

随机推荐

  1. Redis中关于key的操作指令

    1.keys: 例如: 2.exists 3.move 将指定的数据移动到指定的库 4.expire 5.tt1 6.type 7.rename 8.del

  2. 尚硅谷 Go语言核心编程资料

    链接:https://pan.baidu.com/s/1zn8Jf82lxg-2msVS1Iedeg  提取码:5vsg  复制这段内容后打开百度网盘手机App,操作更方便哦

  3. 安全系列之:跨域资源共享CORS

    目录 简介 CORS举例 CORS protocol HTTP request headers HTTP response headers 基本CORS Preflighted requests 带认 ...

  4. request内部转发Demo

    // 转发的Demo1 import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import ja ...

  5. 《手把手教你》系列技巧篇(二十六)-java+ selenium自动化测试-浏览器操作(详细教程)

    1.简介 在Web自动化的操作中,我们通常需要使用一些方法来操作浏览器,今天就来学习一下.这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解. 2.浏 ...

  6. matlab函数randperm()

    randperm()会返回一个行向量. 1,randperm(n) 输出一个1×n的矩阵,元素值为1~n的整数,每个元素只出现一次,元素的顺序是随机的. 2,randperm(n,k) 输出一个1×k ...

  7. jquery .play()报错is not a function

    报错原因:play()方法属于DOM对象方法,$('#audio')为jquery对象解决办法:将jquery对象转换为DOM对象首先打印jquery对象$('#audio') 两种转换方式将一个jQ ...

  8. 3gcms导航,实现当前栏目高亮的办法

    <volist name="menu" id="vo" offset="0" length='8' key='k'> <l ...

  9. Selenium多浏览器并行测试

    如果需要同时在IE.firefox.chrome进行测试,可以使用grid. Selenium Grid是一个智能代理服务器,允许Selenium测试将命令路由到远程Web浏览器实例.其目的是提供一种 ...

  10. contos 7修改root密码

    https://www.linuxidc.com/Linux/2018-01/150211.htm 下面是CentOS 7的root密码修改 开机按esc 选择CentOS Linux (3.10.0 ...