文章来源:微信公众号:猿天地  

1. 死锁的概念:

  是Java多线程情况下,两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都讲无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程成为死锁进程。

2. 出现死锁的条件:

 (1)必须是两个或者两个以上进程(线程)

 (2)必须有竞争资源

3. 如果排查代码中出现了死锁?

 死锁代码:

public class JStackDemo {

    public static void main(String[] args) {
Thread t1 = new Thread(new DeadLockTest(true));
Thread t2 = new Thread(new DeadLockTest(false));
t1.setName("thread-test-1");
t2.setName("thread-test-2");
t1.start();
t2.start();
} } class DeadLockTest implements Runnable { public boolean flag; //控制线程 DeadLockTest(boolean flag) {
this.flag = flag;
} @Override
public void run() {
// 如果flag的值为true则调用t1线程
if(flag){
while (true){
synchronized (Demo.o1) {
System.out.println("o1" + Thread.currentThread().getName());
synchronized (Demo.o2) {
System.out.println("o2" + Thread.currentThread().getName());
}
}
}
} else {
// 如果flag的值为false则调用t2线程
while (true) {
synchronized (Demo.o2) {
System.out.println("o2" + Thread.currentThread().getName());
synchronized (Demo.o1) {
System.out.println("o2" + Thread.currentThread().getName());
}
}
}
}
}
} class Demo {
static Object o1 = new Object();
static Object o2 = new Object();
}

方法一:使用jps + jstack

 1. 在windows命令窗口,使用 jps -l  查看当前的java进程的pid,通过包路径很容易区分出自己开发的程序进程。 

 2. 使用 jstack -l 908 如果出现一下错误信息,说明是死锁线程

方法二:使用jconsole

 在window打开JConsole,JConsole是一个图形化的监控工具。(本人没有试过)

 1. 在windows命令窗口,输出JConsole

 2. 选择到线程的tab页上, 查看线程状态

方法三:使用Java Visual VM

 在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!

 下载地址:https://visualvm.github.io

 1. 在windows命令窗口,输出 jvisualvm ,会弹出Java VisualVM窗口

 

 2. 点击程序要查看的程序线程,选择 “线程” tab页,发现 “监视” 的红颜色线程,就是死锁的。点击右侧 “线程Dump” 可以查看具体错误信息。

最新文章

  1. jQuery图片滚动插件
  2. git 远程库命令
  3. 已禁用对分布式事务管理器(MSDTC)的网络访问的解决方法之一
  4. Oracle 表连接
  5. IOS CALayer(一)
  6. 非ROOT用户启动Tomcat
  7. Quartz CronTrigger配置
  8. 3.css中的颜色
  9. css 之优先策略
  10. Visual Studio 常用快捷键 (二)
  11. CF 121E Lucky Array 【树状数组】
  12. jquery1.9学习笔记 之层级选择器(一)
  13. HDU 1329 Hanoi Tower Troubles Again!(乱搞)
  14. 201521123092《java程序设计》第三周学习总结
  15. 【English】十、"谓语的地方"看到有两个动词:I go say hello.、非谓语形式
  16. php 定时任务
  17. web.py模块使用
  18. select option 选中 取消js
  19. python02 运算符,基本数据类型,整型,字符串
  20. Latest China Scam: I've Been Arrested in the Brothel Crackdown!

热门文章

  1. 小书MybatisPlus第2篇-条件构造器的应用及总结
  2. javaWeb7——PrepareStatement原理,Pareparedstatement和Statement的区别
  3. 学习笔记三:基础篇Linux基础
  4. day04 python入门(变量,基本数据类型)
  5. Video 自动播放
  6. WindowsTerminal折腾记
  7. C++语法小记---string类
  8. C++语法小记---友元
  9. Netty 学习笔记(4) ------ EventLoopGroup
  10. jmeter接口测试 -- 数据库操作(mysql)