java怎么避免死锁(java避免死锁的方法)

Java线程面试题 下

各位老铁们,大家好,今天由我来为大家分享java怎么避免死锁,以及Java中死锁的解决办法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

本文目录

  1. 程序怎样实现死锁该如何分析死锁
  2. Java为什么要抛出异常
  3. java怎么避免死锁
  4. Java并发线程如何阻塞和唤醒

程序怎样实现死锁该如何分析死锁

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

综上所述,产生死锁4个必要条件:互斥、占有且等待、不可抢占、循环等待。

互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。

不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。那么,解决死锁问题就是相当有必要的了。

通过连续多次查看进程的函数调用关系堆栈,死锁线程将一直处于等锁的状态,对比多次的函数调用堆栈输出结果,确定哪两个线程(或者几个线程)一直没有变化且一直处于等锁的状态。

在Java中,可以通过JDK自带的图形化界面工具Jconsole来分析死锁,打开Jconsole连接到需要查看的进程,在线程选项卡下点击“检测死锁”即可检测当前程序的死锁状态。

也可以通过JDK自带的命令行工具Jstack来进行线程Dump分析。通过Jps来查看java进程id,然后通过Jstack输出线程dump信息到文件,根据dump信息文件进行分析,通过查看文件中的

DeadThread.run

信息,找到具体线程的死锁位置。

Java为什么要抛出异常

首先,我们知道Java有3种抛出异常的形式:throw(执行的时候一定抛出某种异常对象),throws(出现异常的可能性,不一定会发生),系统自动抛异常。

throw用在一个语句抛出异常的时候,throw(aninstanceofexceptionclass)比如一个方法/函数里,try{…}catch(Exceptione){thrownewArithmeticException(“XXX”);}finally{…};

throws则是用在声明方法可能抛出异常的时候,throw(exceptionclass)比如publicintdivision(intx,inty)throwsArithmeticException{…};

系统自动抛异常则是当程序语句出现逻辑错误,主义错误或类型转换错误的时候,系统自动抛出异常,比如inta=5;intb=0;c=a/b;这个时候移动会自动抛出ArithmeticException。

什么是异常

异常,顾名思义,就是有异于正常状态,有错误发生。而这错误会阻止Java当前函数方法的运行。

那么Java里面异常的体系是怎么样的呢?

1.Java里面所有不正常类都继承于Throwable类;而Throwable类包括2类:Error类和Exception类。

2.Error类包括虚拟机错误(VirtualMachineError)和线程死锁(ThreadDeath)。

3.Exception类则是我们在说的异常;包括运行时异常(RuntimeException)和检查异常;这里的异常通常是编码,环境,用户操作输入出现了问题。

4.运行时异常(RuntimeException)包括以下4种异常:空指针异常(NullPointerException),数组下标越界异常(ArrayIndexOutOfBoundsException),类型转换异常(ClassCastException),算术异常(ArithmeticException)。

空指针异常:

数组下标越界异常:

类型转换异常:

算术异常:

5.最后剩下的检查异常则是剩下各种异常的集合;这里发生异常的原因有很多,文件异常(IOException),连接异常(SQLException)等等;和运行时异常不同的是,这里的异常我们必须手动在代码里添加try…catch…(finally…)语句来捕获处理。

今天又了解学习到了一些具体的额外的异常:

Throw抛出异常详细过程

和throws声明方法可能会发生异常不同,throw语句则是直接抛出一个异常。

前面有提到,throw(aninstanceofexceptionclass),这里的一个exception类的实例其实也可以说是一个ExceptionObject(Throwable类或则其子类的对象;也可以是自定义的继承自Throwable的直接或间接的异常类)。如果,我们用了thrownewString(“异常XXX”);则会在编译的时候报错,因为String类并不是Throwable类的子类。

接着让我们回到怎么用throw语句的阶段。

一般我们有两种方式来用throw:直接在某处会发生异常的地方用throw语句或则用try…catch…finally…语句来捕获处理异常和关闭释放资源。

首先是第一种,直接在某处会发生异常的地方用throw语句;这是一种主动的方法,主动抛出异常去处理。

而第二种,用try…catch…finally…语句来捕获处理异常和关闭释放资源则是被动的方法。try里面放入可能会发生异常的语句块,如果在运行期间遇到了异常,则会交给catch来处理异常(catch可以是多个,处理不同的异常),finally则是无论有没有异常发生,只要加上了就会运行。

首先我们来看第一种方法的函数:

我们的intc=4/2,其实是正确的;但是我们的throw语句主动抛出了异常,那么程序就会到catch里面找有没有这个异常,有的话进行处理。所以我们要主动抛异常的话,要很确信这个代码一定会发生异常且后期不太会去变动了(最好放在if条件语句里)。所以我们得到的结果如下:

接着我们来看第二种方法。我们一开始先测正确的,只是把主动抛出异常语句给注释掉:

因为try里面的语句块没有异常,所以只执行了try和finally里面的语句块。运行的结果如下:

我们接着来测当try里面的语句块有异常,且没有主动抛出异常的时候,try会不会捕捉到异常吧:

得到的结果如下,会去处理异常和执行finally里面的语句块:

最后深入理解一点try里面的异常触发会逐层向上的这个概念。在我们try语句里主动/被动抛出异常的时候,程序会调向调用者程序(上面的例子里就是我们自己这个函数;但有的时候我们会在try语句里执行别的函数比如B,这个函数B里我们假如触发了异常,它会调向try语句所在的函数A),寻找和它相匹配的catch语句,执行catch语句里面相应的异常处理程序;但假如没有找到相匹配的catch语句,那么它会再转向上一层的调用程序…这样逐层向上,直到最外层的异常程序终止程序并打印出stacktrace。

参考资料

rollbar.com/guides/java…www.javatpoint.com/throw-keywo…www.geeksforgeeks.org/throw-throw…

本文分享自华为云社区《Java-throw异常详解以及过程-云社区-华为云》,作者:gentle_zhou。

java怎么避免死锁

1、尽量使用tryLock(longtimeout,TimeUnitunit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

2、尽量使用java.util.concurrent(jdk1.5以上)包的并发类代替手写控制并发,比较常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,实际应用中java.util.concurrent.atomic十分有用,简单方便且效率比使用Lock更高。

3、尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

4、尽量减少同步的代码块。

百度搜索圈T社区免费行业视频教程

www.aiquanti.com

Java并发线程如何阻塞和唤醒

1.sleep()方法:以毫秒为单位,使线程处于阻塞状态,时间到了过后,自动唤醒。

2.suspend()和resume()方法:挂起和唤醒线程,suspende()使线程进入阻塞状态,只有对应的resumee()被调用的时候,线程才会进入可执行状态。这个不建议使用,容易发生死锁情况。

3.yield()方法:调用yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程

这里就说这三种吧,其它的你可以去csdn上门看看,学习一下

java怎么避免死锁的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java中死锁的解决办法、java怎么避免死锁的信息别忘了在本站进行查找哦。

Java并发编程 如何防止在线程阻塞与唤醒时死锁

本文内容来自互联网,若需转载请注明:https://bk.jguuu.com//11/88430.html