什么是线程死锁
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容介绍了"什么是线程死锁"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!死锁定义死锁产生的条件死
千家信息网最后更新 2025年01月19日什么是线程死锁
本篇内容介绍了"什么是线程死锁"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
死锁定义死锁产生的条件死锁示例如何避免死锁
1. 死锁定义
● 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成互相等待的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去
2. 死锁产生的条件
● 互斥条件:指线程对已经获取到的资源进行排它性使用,即该资源同时只由一个线程占用。如果此时还有其他线程请求获取该资源,则请求者只能等待,直至占有资源的线程释放该资源。● 请求并持有条件:指一个线程已经持有了至少一个资源,但又提出了新的资源请求,而新资源已被其他线程占有,所以当前线程会被阻塞,但阻塞的同时并不释放自己已经获取的资源。● 不可剥夺条件:指线程获取到的资源在自己使用完之前不能被其他线程抢占,只有在自己使用完毕后才由自己释放该资源。● 环路等待条件:指在发生死锁时,必然存在一个线程-资源的环形链,即线程集合{T0, T1, T2, …, Tn}中的T0正在等待一个T1占用的资源,T1正在等待T2占用的资源,……Tn正在等待已被T0占用的资源。
3. 死锁示例
package com.pimee.thread.deadlock;/** * 线程死锁示例 */public class DeadLock { private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { [@Override](https://my.oschina.net/u/1162528) public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + "get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceB"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); Thread threadB = new Thread(new Runnable() { [@Override](https://my.oschina.net/u/1162528) public void run() { synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceA"); synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); } } } }); threadA.start(); threadB.start(); }}
4. 死锁的避免
● 加锁顺序:线程按照相同的顺序加锁。● 加锁时限,线程获取锁的过程中限制一定的时间,如果给定时间内获取不到,就算了,别勉强自己。这需要用到Lock的一些API
上面死锁的demo,修改一下加锁的书序,可以解决问题
package com.pimee.thread.deadlock;/** * 线程死锁示例 */public class DeadLock { private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { @Override public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceB"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceA"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); threadA.start(); threadB.start(); }}
可以使用jstatck查看jvm日志,你会发现以下结果:
"什么是线程死锁"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
线程
资源
死锁
条件
示例
正在
过程
两个
内容
同时
情况
时间
更多
知识
顺序
阻塞
实用
相同
学有所成
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
欧米计算机软件开发
数据库哪个表是会员积分
手机服务器错误处理
学习软件开发电脑配置
app服务器型号怎么看
sql数据库截图员工管理
市场分析数据库
达内特网络技术有限公司
外账怎么合理数据库
中国网络安全管理双语文本
无线网连接不上服务器是什么原因
哪些大学软件开发专业强
黑帽子群站服务器搭建
重庆地图软件开发平台
研究移动数据库
九江睿尚软件开发有限公司
小型服务器的安全要求
北京为村互联网科技有限公司
南昌新手招聘软件开发程序员
网络安全管理体系战略架构
旧电脑变成一体服务器
玫瑰互动网络技术
数据库和生活有什么连接
阴阳师在哪看服务器排名
航天广电网络广播服务器操作界面
数据库流量大小
江苏网络安全答题答案
一键修改数据库密码
网络安全法错误的
四川纺织外贸软件开发公司