在java多线程编程中很容易出现死锁,死锁就是多个线程相互之间永久性的等待对方释放锁,这和数据库多个会话之间的死锁类似。下面的代码示例了一个最简单的死锁的例子,线程1和线程2相互之间等待对方释放锁来取得cpu执行权。

class DeadLockTest implements Runnable{

	private String str;

	private Object lock1 = new Object();

	private Object lock2 = new Object();

	public void run()
{
if(str.equals("a"))
{
synchronized(lock1)
{
try {
System.out.println("str is a ! thread-name:" + Thread.currentThread().getName());
Thread.sleep(3000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("lock1 -- > lock2 !");
}
}
}
if(str.equals("b")) {
synchronized (lock2) {
System.out.println("str is b ! thread-name:" + Thread.currentThread().getName());
synchronized (lock1) {
System.out.println("lock2 -- > lock1 !");
}
}
} } public String getStr() {
return str;
} public void setStr(String str) {
this.str = str;
} }

main方法代码:

public class LockReGetDemo {
public static void main(String[] args) throws InterruptedException {
DeadLockTest deadLock = new DeadLockTest();
Thread t1 = new Thread(deadLock);
deadLock.setStr("a");
t1.setName("A");
t1.start();
Thread.sleep(500l);
Thread t2 = new Thread(deadLock);
t2.setName("B");
deadLock.setStr("b");
t2.start();
}
}

运行后你会发现,打印结果如下,后面的内容一致不会打印,并且程序一直处于等待状态:

str is a ! thread-name:A
str is b ! thread-name:B

那么如何检测死锁呢? 在jvm中给我们提供了一些使用的工具,比如jps和jstack,jps用来查看运行的进程及其id,jstack用来查看具体线程id的运行信息,在上面的死锁例子中,我们进入jvm安装的bin目录,控制台运行jps命令:

然后使用jstack命令查看进程信息

这样就可以知道哪里出现了死锁。

原文链接:http://www.j2eeweb.com/front/get?id=5c4eb0903c517020beb2539e

java死锁示例及其发现方法的更多相关文章

  1. 一个简单的Java死锁示例(转)

    在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...

  2. 如何通过编程发现Java死锁

    本文由 ImportNew - rookie_sam 翻译自 Dzone.欢迎加入翻译小组.转载请见文末要求. 死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态.想要在 ...

  3. java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】

    转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...

  4. java.lang.reflect.Method.getAnnotation()方法示例

    转: java.lang.reflect.Method.getAnnotation()方法示例 作者: 初生不惑 Java技术QQ群:227270512 / Linux QQ群:479429477   ...

  5. android 工程里缺少 R.java 文件原因和解决方法

    作为新手,学习android 的时候难免要导入一些示例,目的为了更加了解android各种API用法,顺便也可以学习下别人代码的写法. 可是导入android源码后,基本都有错误,R.java也不会自 ...

  6. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

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

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

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

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

  9. 实例详解 Java 死锁与破解死锁

    锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...

随机推荐

  1. Spring Boot初识(2)- Spring Boot整合Mybaties

    一.本文介绍 首先读这篇文章之前如果没有接触过Spring Boot可以看一下之前的文章,并且读这篇文章还需要你至少能写基本的sql语句.我在写这篇文章之前也想过到底是选择JPA还是Mybaties作 ...

  2. Controller:EOS区块链核心控制器

    Controller是EOS区块链的核心控制器,其功能丰富.责任重大. 关键字:EOS,区块链,controller,chainbase,db,namespace,using,信号槽,fork_dat ...

  3. git第八节---git 撤销和回滚

    # git 撤销 1. 未添加进暂存区的撤销  --未git add 2.添加进暂存区的撤销--  已git add 未git commit 未添加进暂存区的撤销命令:git checkout -- ...

  4. netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)

    接口定义 io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel ...

  5. openssl speed和openssl rand

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 openssl speed 测试加密算法的性能. 支持的算法有: o ...

  6. base64编码的作用【转】

    转自:https://www.zhihu.com/question/36306744/answer/71626823 X.509公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要 ...

  7. C++注入记事本升级版,给记事本弄爱心

    #include <iostream>; using namespace std; #include <windows.h>; #include <tlhelp32.h& ...

  8. 【Java】模拟Sping,实现其IOC和AOP核心(一)

    在这里我要实现的是Spring的IOC和AOP的核心,而且有关IOC的实现,注解+XML能混合使用! 参考资料: IOC:控制反转(Inversion of Control,缩写为IoC),是面向对象 ...

  9. 设计模式之状态模式(State )

    状态模式是根据其状态变化来改变对象的行为,允许对象根据内部状态来实现不同的行为.内容类可以具有大量的内部状态,每当调用实现时,就委托给状态类进行处理. 作用 当一个对象的内在状态改变时允许改变其行为, ...

  10. blfs(systemv版本)学习笔记-编译安装ligtdm显示管理器

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! ligtdm带有显示管理器和登录器,参照我的笔记安装xorg和i3后安装lightdm,就可以组成一个简易的桌面环境了 下面是l ...