java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java线程死锁

Java中的线程死锁解读

作者:小白不很白

这篇文章主要介绍了Java中的线程死锁解读,死锁就是指两个或两个以上的线程在抢占资源时,造成相互等待的现象,称为死锁,在没有外力的情况下是会一直等待无法执行下去,需要的朋友可以参考下

Java线程死锁

线程死锁就是指两个或两个以上的线程在抢占资源时,造成相互等待的现象,称为死锁。在没有外力的情况下是会一直等待无法执行下去的。

在这里插入图片描述

1. 死锁产生必须具备以下条件

例:

public class User {
    private static Object objectA = new Object();
    private static Object objectB = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (objectA){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("111111111111");
                    synchronized (objectB){
                        System.out.println("222222222222");
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (objectB){
                    Thread.sleep(1000);
                    System.out.println("3333333333333");
                    synchronized (objectA){
                        System.out.println("44444444444444");
                    }
                }
            }
        }).start();
    }
}

分析:首先objectA、objectB都是互斥资源。当第一个线程获取到objectA资源时,还需要请求objectB资源,当第一个线程获取到objectB资源时,还需要请求objectA资源。这样就造成了请求并持有条件。第一个和第二个获取的资源当他们没有执行结束时都不可被剥夺,这样就形成资源不可剥夺条件。第一个线程需要objectB资源,造成在等待 持有objectA资源,第二个线程需要objectA资源,造成在等待objectA的时候 持有objectB资源,这就形成了环路等待条件,所以就造成了死锁。

2. 如何避免死锁

避免死锁只需要把四种中的一个给破坏掉就可以了。但是我们只能破回掉,环路等待条件请求并持有条件

造成死锁的条件其实和线程请求资源的顺序有很大的关系,使用资源的有序性原则就能很大可能的避免死锁。

例:

public class User {
    private static Object objectA = new Object();
    private static Object objectB = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (objectA){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("111111111111");
                    synchronized (objectB){
                        System.out.println("222222222222");
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (objectA){
                    System.out.println("3333333333333");
                    synchronized (objectB){
                        System.out.println("44444444444444");
                    }
                }
            }
        }).start();
    }
}

如上代码就是把这两个线程申请的资源顺序给调成一样的了,这样就可以避免死锁,当第一个线程请求完毕,另一个线程才能占有资源,这样就不会造成线程的死锁了。

到此这篇关于Java中的线程死锁解读的文章就介绍到这了,更多相关Java线程死锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文