一、死锁的定义

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

那么我们换一个更加规范的定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。

二、Java 代码模拟死锁

代码示例:/**

* 模拟死锁类

* */

public class ImitateDeadLock {

public static void main(String[] args) {

final Object a=new Object();

final Object b=new Object();

//线程 threadA 获取对象 a 的锁之后,休眠10秒, 尝试获取对象 b 的锁

Thread threadA=new Thread(new Runnable() {

@Override

public void run() {

synchronized (a) {

System.out.println("threadA 获取到对象 a 的锁");

try {

Thread.sleep(10000);

synchronized (b) {

System.out.println("threadA 获取到对象 b 的锁");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

//线程 threadB 获取对象 b 的锁之后,休眠10秒, 尝试获取对象 a 的锁

Thread threadB=new Thread(new Runnable() {

@Override

public void run() {

synchronized (b) {

System.out.println("threadB 获取到对象 b 的锁");

try {

Thread.sleep(10000);

synchronized (a) {

System.out.println("threadB 获取到对象 a 的锁");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

threadA.start();

threadB.start();

}

}

运行结果:threadA 获取到对象 a 的锁

threadB 获取到对象 b 的锁

无限等待........

三、如何解决

1、确认问题

(1)Jps + Jstack 命令

Jps : 查看当前进程

如下所示, class 名称为ImitateDeadLock的进程为我们需要查看的进程。C:\Users\31415> jps

1256 ImitateDeadLock

9240 Jps

7548 org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar

jstack : 查看堆栈信息

执行 jstack 命令后,会显示出两个线程互相等待,产生了死锁。C:\Users\31415>jstack 1256

Java stack information for the threads listed above:

===================================================

"Thread-1":

at ImitateDeadLock$2.run(ImitateDeadLock.java:37)

- waiting to lock <0x048b15a8> (a java.lang.Object)

- locked <0x048b15b0> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:745)

"Thread-0":

at ImitateDeadLock$1.run(ImitateDeadLock.java:17)

- waiting to lock <0x048b15b0> (a java.lang.Object)

- locked <0x048b15a8> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

2、处理问题

(1)确定的顺序获取锁

例如:我们上面的 Demo 中,两个线程获取锁的顺序都为 先获取对象 a 的锁,在获取对象 b 的锁,就不会出现死锁的问题。

(2)超时放弃

当使用synchronized关键词提供的内置锁时,只要线程没有获得锁,那么就会永远等待下去,然而Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。通过这种方式,也可以很有效地避免死锁。

想了解更多相关教程请访问:java入门学习

java 解决死锁_如何解决java中的死锁问题相关推荐

  1. sql server死锁_了解SQL Server中的死锁图的XML描述

    sql server死锁 介绍 (Introduction) 在我的前两篇文章" What is a SQL Server Deadlock and 什么是SQL Server死锁" ...

  2. sql server死锁_了解SQL Server中的死锁定义

    sql server死锁 This article explains the deadlock definition in SQL Server, and it also mentions how t ...

  3. sql server死锁_如何解决SQL Server中的死锁

    sql server死锁 In this article, we will talk about the deadlocks in SQL Server, and then we will analy ...

  4. 解压后java文字乱码_怎么解决java解压zip包出现乱码

    怎么解决java解压zip包出现乱码 发布时间:2020-06-23 09:02:42 来源:亿速云 阅读:107 作者:Leah 怎么解决java解压zip包出现乱码?相信很多没有经验的人对此束手无 ...

  5. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  6. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  7. java实现递归算法_如何在Java中实现二进制搜索算法而无需递归

    java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...

  8. java 添加注解_你知道Java中的package-info的作用吗?

    package-info.java对于日常业务开发的开发者来说,可能有点陌生,如果我们再项目中创建一个package-info.java,你会发现该类只有一个packge,如下 我们无法在该java文 ...

  9. java插入图片_如何在java窗体程序中添加图片

    打开eclipse,创建一个java工程项目,创建完后在src下新建一个类Window,由于要插入图片,所以还在工程目录下创建一个文件夹imgs,里面放了一张60*60的图片,创建后的工程目录和图片, ...

最新文章

  1. 不同网段的两台主机互通问题
  2. 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  3. 一步一步打造Geek风格的技术博客
  4. java全写_Java 写文件
  5. PMCAFF产品经理第一课 | 杭州站 现场集锦
  6. 面试:史上最全多线程面试题 - (锁内存模型线程)
  7. oracle 无法解析指定的连接标识符
  8. 小程序和app用什么样的服务器,小程序和APP的本质区别是什么?哪个更值得开发?...
  9. 课后作业一 小九九 课后作业二 任意一个数在此范围被七整除的个数...
  10. 微课|玩转Python轻松过二级:第3章课后习题解答3
  11. string 引用没有设置为 string 的实例。 参数名: s_Java中的值传递和引用传递,看完这篇终于终于明白了!...
  12. Hibernate中的命名SQL查询
  13. 使用go语言解析xml
  14. 《深入分析Java Web技术内幕》读书笔记
  15. 鬼谷八荒宗门亲密度怎么提升
  16. 微信公众号cookie+token获取
  17. JavaScript Date相关练习
  18. MIT6.824-lab3AB-2022(万字推导思路及代码构建)
  19. python100day - day24 - DataAnalysis
  20. 关于QA QE QC 测试职位的区别

热门文章

  1. python中列表的值与内存地址_python---列表、元组
  2. mysql 页级锁写法_MYSQL中表级锁、行级锁、页级锁介绍
  3. cdr放大后内容消失了_今日推荐:AI智能图片清晰放大神器强势来袭,简直无敌了...
  4. 一个java实现的简单日历,采用左树右列表的方式实现,具有参考意义
  5. Part Ⅱ At the Restaurant 在饭店??
  6. 订餐系统项目中OrderForm、OrderDTO、OrderMaster和ResultVO的区别
  7. 计算机英语讲课笔记05
  8. 大数据学习笔记34:Hive - 数据库与表操作
  9. 【BZOJ4516】生成魔咒,后缀数组+Splay
  10. 2017.3.24 分裂游戏 思考记录