java中死锁

当两个线程相互等待对方释放同步监视器时就会发生死锁,java虚拟机没有监测,也没有采取措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁出现。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。

死锁实例:

 1 public class DeadLock implements Runnable{
 2     A a=new A();
 3     B b=new B();
 4     public void init(){
 5         Thread.currentThread().setName("主线程");
 6         //调用对象的foo()方法
 7         a.foo(b);
 8         System.out.println("进入主线程之后");
 9     }
10     public void run(){
11         Thread.currentThread().setName("副线程");
12         //调用b对象的bar()方法
13         b.bar(a);
14         System.out.println("进入副线程之后");
15     }
16     public static void main(String[] args){
17         DeadLock d1=new DeadLock();
18         //以d1为target启动新线程
19         new Thread(d1).start();
20         //调用init()方法
21         d1.init();
22     }
23 } 
24 class A {
25     public synchronized void foo(B b)
26     {
27         System.out.println("当前线程名:"+Thread.currentThread().getName()+"进入了A实例的foo方法");//(1)
28         try{
29             Thread.sleep(1000);
30         }catch(Exception e){
31             System.out.println(e);
32             }
33             System.out.println("当前线程名:"+Thread.currentThread().getName()+"企图调用B实例的last方法");//(3)
34             b.last();
35     }
36     public synchronized void last(){
37         System.out.println("进入A类的last方法内部");
38     }
39 }
40 class B{
41     public synchronized void bar(A a){
42         System.out.println("当前线程名:"+Thread.currentThread().getName()+"进入B实例的bar方法");//(2)
43         try{
44             Thread.sleep(1000);
45             }catch(Exception e){
46                 System.out.println(e);
47                 }
48                 System.out.println("当前线程名:"+Thread.currentThread().getName()+"企图调用A实例的last方法。");//(4)
49                 a.last();
50     }
51     public synchronized void last(){
52         System.out.println("进入B类的last方法内部");
53     }
54 
55 }

 

 解释:上面程序中A对象和B对象的方法都是同步方法,也就是A对象和B对象都是同步锁。

程序中的两个线程执行:一个线程的线程执行体是DeadLock类的run方法,另一个线程的线程执行体是DeadLock的init()方法(也就是主线程调用了init方法)。

其中run()方法让B对象调用bar()方法,而init()方法让A对象调用foo()方法。

分析:如果init()方法先执行,调用了A对象的foo方法,进入foo方法之前,该线程对A对象加锁——————当程序执行到(1)号代码时,主线程暂停1000ms;CPU切换到执行另一个线程,让另一个线程对B对象加锁——————当程序执行到(2)代码时,副线程也暂停1000ms;接下来主线程会先醒过来,继续向下执行,直到(3)号代码处希望调用B对象的last()方法——————执行该方法之前必须先对B对象加锁,但此时B线程正保持着B对象的锁,所以主线程阻塞;接下来副线程应该醒过来了,继续向下执行,直到(4)号代码处希望调用A对象的last()方法——————执行此方法之前必须先对A对象加锁,但此时主线程没有释放对A对象的锁,至此,就出现了主线程保持着A对象的锁,等待B对象加锁,而副线程保持着B对象的锁,等待着A对象的锁,等待对A对象加锁,两个线程互相等待对方先释放,所以就出现了死锁!

转载于:https://www.cnblogs.com/teng-IT/p/4450216.html

理解Java死锁之死锁检测 作者:禹明明,叩丁狼高级讲师。原创文章,转载请注明出处。看此文章前请先了解之前一篇文章 “Java死锁之理解死锁” 中的死锁示例我们在开发中应该尽量避免死锁,但是如果真的有死锁产生那么我们怎么在一个复杂的项目中快速的找到死锁产生的原因呢?我大概总结了一下常用的几种方式:使用JConsole检测死锁在我们的JAVA_HOME/bin目录下我们可以找到一个jdk提供的虚拟机监控工具叫Jconsole,... 阅读详情

相关推荐

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2650

多线程死锁的产生以及如何避免死锁

当两个线程互相等待对方释放资源的时候,就会发生死锁,一旦产生死锁,程序不会发生任何异常,也不会给出提示,所有的线程都处于阻塞状态,无法继续 A线程持有a锁,等待获取b锁,同时B线程持有b锁,等待获取a锁 产生死锁的必须满足四个条件 互斥条件:一个资源每次只能被以一个进程使用,若有其他进程请求该资源,则请求只能等待 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他线程所占有,此时请求进程被阻塞,但自己已获得的资源保持不放 不可剥夺条件:进程所获得的资源在未使用完毕之前,不

qq_43460095的博客 636

机器学习-02 模型的评估与选择

2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义: 在训练集上的误差称为训练误差(training error)或经验误差(empirical error)。 在测试集上的误差称为测试误差(test error)。 学习器在所有新样本上的误差称为泛化误差(generalization error)。 显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这

一个小白 1707

java死锁的原理和排除_Java中死锁的原理实战分析|chu

本文实例讲述了Java中死锁的原理。分享给大家供大家参考,具体如下:一 点睛当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚拟机没有监测、也没有采用措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁的出现。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。二 代码class A { public synchronized...

weixin_31182871的博客 193

UDS诊断入门第一课:手把手教你玩转0x10会话控制服务(附ISO14229实战解析)

刚接触汽车电子诊断的工程师们,往往会被厚厚的ISO 14229标准文档和各种专业术语吓退。但就像学习编程要从"Hello World"开始一样,掌握UDS协议的最佳切入点就是0x10诊断会话控制服务。这个看似简单的服务,实际上是整个诊断系统的"钥匙"——它决定了ECU(电子控制单元)当前处于何种工作模式,直接影响着其他诊断服务的可用性。 在实际车辆诊断中,ECU默认处于DefaultSession模式,这种模式下许多高级诊断功能是被禁用的。想象一下你正在开发一个需要刷写ECU固件的工具,如果连最基本的会

weixin_30402343的博客 394

Google Cameraserver 看门狗CameraServiceWatchdog超时crash原理分析

本文分析了Android CameraServiceWatchdog机制的工作原理。该看门狗用于监控相机服务关键操作(如close、flush)的超时情况,通过定时器线程检测阻塞问题。文章详细讲解了Watchdog的初始化流程、使能方式、内部定时器机制(默认周期100ms,650次循环触发超时),并提供了configureStreams阶段的客制化实现方案。当检测到超时,Watchdog会触发abort生成tombstone日志,便于调试分析。

1132

Java线程死锁

当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚拟机没有监测,也 没有采取措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁出现。一旦 出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于 阻塞状态,无法继续。 在系统中出现多个同步监视器的情况下很容易发生死锁。 为充分理解死锁,观察它的行为是很有用的。下面的例子生成了两个类,A和B,分别有foo( )...

weixin_44565959的博客 288

6、基因组数据可视化与甲基化分析:从基础操作到深入洞察

本文详细介绍了基因组数据可视化和全基因组DNA甲基化分析的方法和技术,包括基因组查看器(IGV)的基本操作、单核苷酸变异的可视化、DNA甲基化与CpG岛的关联分析、统计建模与显著甲基化区域识别,以及不同细胞系之间的甲基化模式差异分析。通过具体案例展示了如何利用MATLAB进行数据分析和可视化,为基因组研究、疾病机制探索及个性化医疗提供了技术支撑和实践参考。

qsc901234的博客 295

java 死锁问题

Java死锁是指两个或多个线程在互相请求对方占用的资源时处于等待状态,导致程序无法继续执行的现象。死锁发生的原理是由于每个线程都持有一个资源并且同时等待另一个资源,这样就会形成一种僵局,没有任何一个线程能够释放其持有的资源,也无法获得它所需的资源。这样的情况下,程序就会停止响应,形成死锁。解决死锁通常需要使用一些技术手段,如避免嵌套锁、使用可重入锁、资源分配策略等。死锁(Deadlock)指的是在多线程并发编程中,由于两个或多个线程互相持有对方所需的资源而导致它们都陷入无限等待的状态。

saint_la的博客 2091

软件设计师高频考点—套路题

学习交流的总结

秩沅 2541

[QMT量化交易小白入门]-九十五、多因子选股和趋势择时股票量化交易策略,年化收益率40.61%

本策略采用“双层过滤”机制:第一层基于多维度财务指标进行股票池筛选(多因子选股),第二层运用均线系统和MACD指标实施动态择时(趋势跟踪)。这种设计既保证了组合的质量下限,又能灵活应对市场波动。因子配置科学性:涵盖估值、成长、盈利、动量四大类因子风险控制精细化:设置动态止损与仓位管理机制信号验证严格性:多重条件交叉验证提升胜率。

木头大左的博客 802

Java 线程死锁及如何避免死锁介绍

死锁是指两个或两个以上的线程在执行过程中,**因争夺资源而造成的互相等待**的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去,

weixin_46448719的博客 4848

Unity零基础到入门 ☀️| 【UI系统学习】认识Unity引擎中几种最常用 UI系统,这一篇文章就够用了!

轻松学会 Unity 的 UGUI基础控件 使用 Unity中的UI介绍 UI即User Interface(用户界面)的简称。泛指用户的操作界面,UI设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 据我所知Unity中有两种自带的UI,一种是UGUI,一种是GUI Legacy GUI:旧版 UI,只有两个组件:文字和图片,配合鼠标事件来

努力前行,总会成为自己心中的那道光 2万+

死锁-java线程死锁

死锁是计算机系统中一个常见的问题,它指的是两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

qq_34358193的博客 1604

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Java 死锁】用Java写个死锁

写个死锁bug 死锁发生场景之一大概就是。 如果有两个线程A and B。 如果A执行了一段任务想等B执行完成再执行,同样如果B如果执行了一半想等等A。那么就会一直等到天长地久QWQ。 实例代码: public static void main(String[] args) { test2(); } public static void test2(){ ...

当你在抱怨为什么没有时,请记住,这是你的机会! 1762

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java——死锁

1. 产生条件 一般来说,要出现死锁问题需要满足以下条件: 互斥条件:一个资源每次只能被一个线程使用。 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:线程已获得的资源,在未使用完之前,不能强行剥夺。 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。 在JAVA编程中,有3种典型的死锁类型: 静态的锁顺序死锁 动态的锁顺序死锁 协作对象之间发生的死锁。 下面来一一介绍这三种死锁: 2. 静态的锁顺序死锁 a和b两个方法都需要获得A锁和B锁。一个线程执

Yawn 1993

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java如何避免死锁

文章目录一、什么是死锁二、怎么排查死锁三、死锁产生的4个必要条件四、避免死锁的方法 一、什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析它。 package com.sukang.sort; /** * @description: * @author: sukang * @date: 2020-11-09 15:48 */ public class

suchahaerkang的博客 4052

Java线程之如何分析死锁及避免死锁

什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析它。 怎么实现死锁 下面我们一起看一个简单的死锁事例,在主线程中每隔5秒钟启动一个线程,每个线程的执行时间是3秒钟 package com.lkf.mulithread; ...

码客 1万+

java中常见的死锁以及解决方法

在java中我们常常使用加锁机制来确保线程安全,但是如果过度使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,但是这些被限制的行为可能会导致资源死锁。java应用程序无法从死锁中恢复过来,因此设计时一定要排序那些可能导致死锁出现的条件。 1.一个最简单的死锁案例 当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。在线程A持有锁L并想获得...

diligence-zpf 3万+

Java如何查看死锁?

ava中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。 因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢? Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题

ZK_小小世界的专栏 2万+

Java 中的死锁

这样虽然避免了循环等待,但是这种方法是比较低效的,资源的执行速度回变慢,并且可能在没有必要的情况下拒绝资源的访问,比如说,进程c想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。

麦克马的博客 753

Java死锁问题

死锁定义 1)进程死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 2)线程死锁是指由于两个或者两个以上的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。 产生死锁的四个必要条件 1)互斥条件:指进程对所分配到...

lijiajun_blog的博客 2015

什么是死锁,如何避免死锁?Java死锁详解

什么是死锁 死锁是指多个进程因竞争资源而引起的一种僵局,如果没有外力作用,所有进程都不会向前推进。 举例:假如有线程Thread1和Thread2,两个都要访问共享资源AB,Thread1和Thread2一个先访问A再访问B,另一个先访问B再访问A。但在他们线程未执行完时,都不会释放AB资源,那么就形成了一种僵局,Thread1在等待Thead2施放B资源,Thread2在等待Thread1释放A资源,两个进程就形成了一种僵局,下面以Java代码实现为例说明: public class DeadThrea

weixin_44137260的博客 975

java 中死锁是什么如何避免死锁

这种情况通常发生在多个线程争夺有限资源(如内存、文件句柄等)时,如果每个线程都持有至少一个资源并等待获取其他线程持有的资源,就会发生死锁。假设有两个资源(资源A和资源B)和两个线程(线程1和线程2)。资源A和资源B都需要在同一个线程中被访问,而且它们的访问顺序必须为资源A -> 资源B。为了确保线程安全,我们可以使用两个锁(锁A和锁B)来控制对资源A和资源B的访问。总之,避免死锁需要仔细设计并发程序,并采取适当的策略来管理线程对资源的访问。// 访问资源B的代码。)来控制对资源A和资源B的访问。

weixin_42095178的博客 585

Java死锁范例以及如何分析死锁

死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源。在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它。 Java死锁范例 ThreadDeadlock.java 1 2 3 4 5 6 7 8 9 10 11 12

network_boy的专栏 754
上一篇: 同步锁(lock)
下一篇: java中线程通信(传统的线程通信)
aixirang3421
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值