这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、死锁的定义

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

2、死锁产生的必要条件

互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有线程请求该资源,则请求线程只能等待。

不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程倾向夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该线程已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{P1,P2,...,Pn},其中Pi等待的资源被P(i+1)占有(i=0,1,..,n-1),Pn等待的资源被P0占有,如下图。

3、产生死锁的一个例子

/**

* 一个简单的死锁类

* 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500ms

* 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500ms

* td1 睡眠结束后需要锁定 o2 才能继续执行,而此时 o2 已被 td2 锁定;

* td2 睡眠结束后需要锁定 o1 才能继续执行,而此时 o1 已被 td1 锁定;

* td1、td2 相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。

*/

public class DeadLock implements Runnable {

public int flag = 1;

//静态对象是类的所有对象共享的

private static Object o1 = new Object(), o2 = new Object();

@Override

public void run() {

System.out.println("flag="+flag);

if(flag==1){

synchronized (o1){

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (o2){

System.out.println("1");

}

}

}

if(flag==0){

synchronized (o2){

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (o1){

System.out.println("0");

}

}

}

}

public static void main(String[] args) {

DeadLock td1 = new DeadLock();

DeadLock td2 = new DeadLock();

td1.flag=1;

td2.flag=0;

//td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。

//td2的run()可能在td1的run()之前运行

new Thread(td1).start();

new Thread(td2).start();

}

}

4、如何避免死锁

在有些情况下死锁是可以避免的。两种用于避免死锁的技术

1)加锁顺序(线程按照一定的顺序加锁

2)加锁时限(线程获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java线程死锁_Java线程死锁实例及解决方法相关推荐

  1. java文件乱码_java文件读取出现乱码解决方法

    java读取文件出现乱码解决方法:(推荐:java视频教程) 1.首先将要读取的文本文件的编码格式设置为UTF-8 2.使用InputStreamReader类取读取文件,因为它的构造方法中可以指定字 ...

  2. java 存储表情_java emoji表情存储的解决方法

    1.问题产生情况 我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了. 2. ...

  3. java 显示中文_java显示中文乱码的解决方法

    java显示中文乱码的解决方法 发布时间:2020-06-16 11:08:43 来源:亿速云 阅读:97 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java显示中文乱码的解决方法,代码非常 ...

  4. java中线程死锁的解决方法_Java线程死锁实例及解决方法

    这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...

  5. 线程访问 DevExpress控件异常时 解决方法

    线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...

  6. 死锁与活锁的原因 与解决方法(附加“饿死”)

    死锁与活锁的原因 与解决方法(附加"饿死") 参考文章: (1)死锁与活锁的原因 与解决方法(附加"饿死") (2)https://www.cnblogs.co ...

  7. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另 ...

  8. opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类

    opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...

  9. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  10. linux下java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider解决方法

    linux下java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider解决方法 参考文章: ( ...

最新文章

  1. python语言程序设计——python3的33个保留字
  2. Qt 静态编译后的exe太大, 可以这样压缩.
  3. SQL查询分析器使用
  4. Python 技巧篇 - 英文单词首字母大小写转换功能实例演示,字符串切片实现
  5. c标签foreach遍历list_遍历 Dictionary,你会几种方式?
  6. 文件指针创建失败!File *fp失败
  7. ionic 禁止横屏处理
  8. 五月职场胜如火 Java讲座陪您过
  9. 中国第一朵云,花了足足9年
  10. IT,大一,这里我有点建议
  11. The Django Book
  12. 实用:Google Chrome(谷歌浏览器)键盘快捷键大全
  13. 【驱动详解】如何理解驱动程序
  14. linux学习笔记入门之用户及文件权限
  15. 扫描枪识别条码为乱码
  16. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
  17. Eclips IDE安装Python
  18. 导致计算机科学硕士和计算机科学理学硕士,诺丁汉大学计算机科学理学硕士研究生offer一枚...
  19. 微软软件测试部门裁剪,Windows 10稳定性太差是因为测试团队被裁撤?微软发布博客进行回应...
  20. 【阅读笔记】提升example-based SISR七个技巧

热门文章

  1. 软件教程给MyEclipse 10增加SVN功能
  2. linux 将文件打包、压缩并分割成制定大小
  3. 计算机软硬件日常维护管理规程
  4. 祝微软北京.net俱乐部徐磊生日快乐
  5. 使用Rust库bindgen之Hello World(附代码)
  6. java matcher方法_Java正则表达式入坑指南:正则表达式使用的类有哪些吗?
  7. android判断循环,android kotlin学习之路 kotlin中的分支判断与循环判断(2)
  8. java 809 128 题_java编程题809*??=800*??+9*??+1
  9. oracle归档日志百分比,Oracle归档日志处理
  10. 平均无故障时间100万小时_无故障运行时间MTBF投标要求GB5080.7-中检