java 死锁演示
java 死锁演示
模拟死锁生成
死锁是由多个线程竞争同一个资源导致
package com.feshfans;
/**
* 1. 本代码为展示 java 中死锁的产生
* 2. 死锁的排查方法
*/
public class DeadlockShow {
// 声明两个资源
private static final String ResourceA = "A";
private static final String ResourceB = "B";
private static void deadlock(){
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
// 线程 A 先获取 ResourceA,即线程A持有 ResourceA 的锁
synchronized (ResourceA){
System.out.println("T1 get resource A");
try {
// 休眠 2 秒,目的是为了让线程 B 有足够的时间获取 ResourceB
// 为什么要用 sleep,因为 sleep 方法不会释放锁对象
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ResourceB){
System.out.println("T1 get resource B");
}
}
}
},"Thread-A");
Thread t2= new Thread(new Runnable() {
@Override
public void run() {
// 线程 B 先获取 ResourceB,即线程 B 持有 ResourceB 的锁
synchronized (ResourceB){
System.out.println("T2 get resource B");
try {
// 休眠 1 秒,目的是为了让线程 A 有足够的时间获取 ResourceA
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ResourceA){
System.out.println("T1 get resource A");
}
}
}
}, "Thread-B");
// 启动两个线程
t1.start();
t2.start();
}
public static void main(String[] args) {
deadlock();
// 主线程并不会退出,因为 deadlock() 产生的死锁,子线程一直没有执行完
}
}
死锁查看
- 先使用 jps 查看 java 进程的 pid, 如图:

使用 jstack 查看 java 栈信息,如图:
从上图中可以清楚的看出死锁的个数、哪几个线程之间产生了死锁、线程之间竞争资源的内存地址和资源类型(本例为 String)、产生死锁的代码行数 等信息
个人建议,大家在开启线程时,为每个线程都赋予一个名字,这样出现问题时,就会特别清楚
java 死锁演示的更多相关文章
- Java死锁演示
Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- C#多线程的死锁演示
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- Java线程演示样例 - 继承Thread类和实现Runnable接口
进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
- Java 死锁以及如何避免?
Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.
随机推荐
- FPGA VGA时序的理解
最近在做FPGA毕业设计,毕业设计规划的是摄像头采集图像,经过均值滤波,中值滤波,高斯滤波,然后通过VGA接口控制显示器显示出来,所以最近学习了一下FPGA的VGA驱动的相关内容. VGA接口 如上图 ...
- PEP8-python编码规范(下)
1.结尾逗号 结尾的逗号通常是可选的,除了在构成一个元素的元组时是强制性需要的(在Python 2 中,它们对 print 语句有语义).为了清晰起见,建议将后者用括号括起来(在技术上是多余的). Y ...
- 20191128 Spring Boot官方文档学习【目录】
Spring Boot文档 入门 使用Spring Boot 3.1. 构建系统 3.2. 结构化代码 3.3. 配置类 3.4. 自动配置 3.5. Spring beans和依赖注入 3.6. 使 ...
- Python_Onlineh_Hmework(基础篇,持续更新中...)
1 递归 1.1 定义一个函数,求一个数的阶乘 def func(x): if x == 2: return 2 else: return x*func(x-1) a = func(4) print( ...
- 第七周&实验报告五
实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...
- hive排错
找出错的那个hive实例,看错误日志: 点下面stdout,找Error
- urllib库:分析Robots协议
1from urllib.robotparser import RobotFileParser 2import ssl 3from urllib.request import urlopen 4ssl ...
- start-all.sh启动HDFS,datanode没有启动
第一次格式化dfs后,启动并使用hadoop,之后如果再次重新执行了格式化(hdfs namenode -format) start-all.sh启动时就会遇到datanode无法启动的问题,通常情况 ...
- CF 11D A Simple Task 题解
题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数: 具体的转移方程和细节请看代码: PS:(i& ...
- 推荐几本Python书
Python的书很多,由于python本身应用的领域太多,涉及方方面面的,因此书籍的种类也很多,下面是我推荐一些比较好的python书给大家,大家可以找一两本修炼,定能让你的功力大增. 1.A byt ...