java线程死锁_Java线程死锁实例及解决方法
这篇文章主要介绍了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线程死锁实例及解决方法相关推荐
- java文件乱码_java文件读取出现乱码解决方法
java读取文件出现乱码解决方法:(推荐:java视频教程) 1.首先将要读取的文本文件的编码格式设置为UTF-8 2.使用InputStreamReader类取读取文件,因为它的构造方法中可以指定字 ...
- java 存储表情_java emoji表情存储的解决方法
1.问题产生情况 我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了. 2. ...
- java 显示中文_java显示中文乱码的解决方法
java显示中文乱码的解决方法 发布时间:2020-06-16 11:08:43 来源:亿速云 阅读:97 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java显示中文乱码的解决方法,代码非常 ...
- java中线程死锁的解决方法_Java线程死锁实例及解决方法
这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...
- 线程访问 DevExpress控件异常时 解决方法
线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...
- 死锁与活锁的原因 与解决方法(附加“饿死”)
死锁与活锁的原因 与解决方法(附加"饿死") 参考文章: (1)死锁与活锁的原因 与解决方法(附加"饿死") (2)https://www.cnblogs.co ...
- Java常见的几种内存溢出及解决方法
Java常见的几种内存溢出及解决方法[情况一]: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另 ...
- opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类
opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...
- 我爱Java系列---【 maven依赖版本冲突的解决方法】
我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...
- linux下java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider解决方法
linux下java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider解决方法 参考文章: ( ...
最新文章
- python语言程序设计——python3的33个保留字
- Qt 静态编译后的exe太大, 可以这样压缩.
- SQL查询分析器使用
- Python 技巧篇 - 英文单词首字母大小写转换功能实例演示,字符串切片实现
- c标签foreach遍历list_遍历 Dictionary,你会几种方式?
- 文件指针创建失败!File *fp失败
- ionic 禁止横屏处理
- 五月职场胜如火 Java讲座陪您过
- 中国第一朵云,花了足足9年
- IT,大一,这里我有点建议
- The Django Book
- 实用:Google Chrome(谷歌浏览器)键盘快捷键大全
- 【驱动详解】如何理解驱动程序
- linux学习笔记入门之用户及文件权限
- 扫描枪识别条码为乱码
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
- Eclips IDE安装Python
- 导致计算机科学硕士和计算机科学理学硕士,诺丁汉大学计算机科学理学硕士研究生offer一枚...
- 微软软件测试部门裁剪,Windows 10稳定性太差是因为测试团队被裁撤?微软发布博客进行回应...
- 【阅读笔记】提升example-based SISR七个技巧
热门文章
- 软件教程给MyEclipse 10增加SVN功能
- linux 将文件打包、压缩并分割成制定大小
- 计算机软硬件日常维护管理规程
- 祝微软北京.net俱乐部徐磊生日快乐
- 使用Rust库bindgen之Hello World(附代码)
- java matcher方法_Java正则表达式入坑指南:正则表达式使用的类有哪些吗?
- android判断循环,android kotlin学习之路 kotlin中的分支判断与循环判断(2)
- java 809 128 题_java编程题809*??=800*??+9*??+1
- oracle归档日志百分比,Oracle归档日志处理
- 平均无故障时间100万小时_无故障运行时间MTBF投标要求GB5080.7-中检