300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Java中死锁产生的原因及解决方法

Java中死锁产生的原因及解决方法

时间:2021-06-13 21:03:45

相关推荐

Java中死锁产生的原因及解决方法

一、什么是死锁

死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的现象,若无外力作用,他们都无法推进下去。

简单来说就是A和B若同时都有一个资源,在此之外还想拥有对方的资源,由于资源如果在某个人手里,其他人就无法获得,所以变成了你不让我,我不让你,就僵持下了。

下面我们来看下具体代码:

public class CreateDeadThread {public static void main(String[] args) throws InterruptedException {Object lock1=new Object();Object lock2=new Object();Thread thread1=new Thread(()->{synchronized (lock1){System.out.println("A获取到了锁A");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("A获取到了锁B");}}});thread1.start();Thread thread2=new Thread(()->{synchronized (lock2){System.out.println("B获取到了锁B");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock1){System.out.println("B获取到了锁A");}}});thread2.start();thread1.join();thread2.join();}}

我们可以使用jdk自带的工具查看死锁(jvisualvm/jmc/jconsole),这个一般在你jdk安装目录下的bin目录下,我的就在D:\Program Files\Java\jdk1.8.0_131\bin

二、死锁产生的原因

互斥条件:一个资源只能被一个线程占有,当这个资源被占有后其他线程就只能等待不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有请求并持有条件:线程已经拥有了一个资源后,又尝试请求新的资源环路等待条件:产生死锁一定是发生了线程资源环形链

三、解决方法

知道原因后,我们只需要改变线程的环路访问就可以解决:

public class SaveDeadThread {public static void main(String[] args) throws InterruptedException {Object lock1=new Object();Object lock2=new Object();Thread thread1=new Thread(()->{synchronized (lock1){System.out.println("A获取到了锁A");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("A获取到了锁B");}}});thread1.start();Thread thread2=new Thread(()->{synchronized (lock1){System.out.println("B获取到了锁B");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("B获取到了锁A");}}});thread2.start();thread1.join();thread2.join();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。