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 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.
随机推荐
- nginx代理,负载均衡
#代理,如:通过代理实现访问百度(单个机器)创建vim proxy.conf内容如下server { listen 80; server_name www.baidu.com; location / ...
- Android 调用相机、相册功能
清单文件中增加对应权限,动态申请权限(此部分请参考Android 动态申请权限,在此不作为重点描述) private static final int REQUEST_CODE_ALBUM = 100 ...
- fixture详细介绍-作为参数传入,error和failed区别
前言 fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手! fixture简介 fixture的目的是提供一个固定基线,在该基线上测 ...
- LoadRunner 技巧之 添加事务
事务(Transaction)用于模拟用户的一个相对完整的.有意义的业务操作过程,例如登录.查询.交易.转账,这些都可以作为事务,而一般不会把每次HTTP请求作为一个事务. 拿笔者所测试的邮箱系统为例 ...
- Session对象的生命周期(面试题/笔试题)
创建:第一次执行request.getSession()时创建 销毁: 1)服务器(非正常)关闭时 2)session过期/失效(默认30分钟) 问题:时间的起算点 从何时开始计算30分钟? 从不操作 ...
- rhel安装ambari
RHEL/CentOS/Oracle Linux 6 On a server host that has Internet access, use a command line editor to p ...
- Layer 弹出层抖动问题
layer.open({ type: 2, anim: 5,//加上anim,渐显 title: '品牌列表', shadeClose: fal ...
- echarts 饼图-->如何修改legend模板?
首先需要在初始化图表的方法中过滤一下数据 ,将你需要的 名称 所占百分比 所占数量 筛选出来 let dataFilter = [ { value: 20, name: "未知" ...
- vue2 学习笔记
一.部署环境1.安装nodeJS -- 地址:https://nodejs.org/zh-cn/ 2.安装vue脚手架 (用于创建VUE项目的) 进入项目文件或者新建一个文件 npm install ...
- Dubbo基础、高级讲解
基础 https://blog.csdn.net/hardworking0323/article/category/6148466 高级 https://blog.csdn.net/hardworki ...
