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 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.
随机推荐
- Oracle中生成随机数的函数
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...
- global和nonlocal的用法
1 nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量.写在内部嵌套函数里面,它实质上是将该变量定义成了全局变量,它等价于用两个global来定义该变量.只不过用两个gl ...
- python3.5 append使用
1.从元组中添加 friends=[] tup1=("Jon",35) friends.append(tup1[0]) print(friends[0]) ssh://root@1 ...
- java游戏服务器--简单工厂模式
先来学习下简单工厂模式! 我们知道在游戏里有很多的场景,例如:帮派场景,副本场景,野外场景... 现在我们有这样的需求: 1.我们需要进入帮派场景时---开始执行帮派任务. 2.我们需要进入副本场景时 ...
- 在IOS系统中微信浏览器input输入框输入值无效
[contenteditable="true"], input, textarea { -webkit-user-select: auto!important; -khtml-us ...
- python指定pip安装源
python的pip默认的安装源的位置是国外的,导致有时候下载很慢或者直接失败我们可以切换国内的源 目前国内可用的我知道的有两个 豆瓣的:http://pypi.doubanio.com/simple ...
- python学习之模块-模块(四)
5.9 logging模块 常用参数 logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHan ...
- python 正则sub的使用
self.content = re.sub(r'>|<',lambda x: '>' if x.group()[0] == '>' else '<' , s ...
- 【Linux 网络编程】网络IP地址结构体
(1)IPv4套接口地址结构通常也称为"网际套接字地址结构",它以"sockaddr_in"命名, 定义在<netinet/in.h> ...
- Maven - Maven3实战学习笔记(3)使用maven构建Web应用
1.jetty-maven-plugin自动化测试Web应用工具 <plugin> <groupId>org.mortbay.jetty</groupId> < ...