温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java多线程环境下如何实现死锁

发布时间:2021-12-13 09:08:57 来源:亿速云 阅读:156 作者:小新 栏目:开发技术

这篇文章主要介绍Java多线程环境下如何实现死锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1、死锁产生的条件

  • 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。

  • 不可抢占:不能抢占进程已占有的资源

  • 请求和保持:当一个进程等待其他进程释放资源时,继续占有已经分配的资源

  • 循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。

注意:前三个条件都只是死锁存在的必要条件,但不是充分条件。第四个条件是充分条件。以上条件同样适用于线程。

2、模拟多线程环境下死锁的产生

/**
 * 死锁产生的四个条件:互斥 请求和保持 不可抢占 循环等待
 * synchronized锁住对象资源,保证互斥和不可抢占
 * 先持有一个资源,再去申请另一个资源->请求和保持
 */
public class DeadLock {

    // 模拟两个资源
    public static Object lock1 = new Object();
    public static Object lock2 = new Object();

    // 先申请lock1资源,再去申请lock2资源
    public static void getLock1First(){
        synchronized (lock1){
            System.out.println("getlock1");
            getLock2();
        }
    }

    public static void getLock2(){
        synchronized (lock2) {
            System.out.println("lock1->lock2");
        }
    }

    // 先申请lock2资源,再申请lock1资源
    public static void getlock2First(){
        synchronized (lock2){
            System.out.println("getlock2");
            getLock1();
        }
    }

    public static void getLock1(){
        synchronized (lock1){
            System.out.println("lock2->lock1");
        }
    }

    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                // 太难把控线程运行的时机了 也有可能此线程执行完了lock1->lock2的顺序
                // 直接死循环一直运行
                // 总会刚好遇到线程1刚好获得lock1,线程2刚好获得lock2
                while (true){
                    getLock1First();
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                while (true){
                    getlock2First();
                }
            }
        }.start();
    }
}

死锁:

Java多线程环境下如何实现死锁

3、死锁的排查

先进入jdk安装的bin目录,启动命令行,输入命令jps查看运行的线程ID

死锁检测1:

Java多线程环境下如何实现死锁

执行jstack -l 线程ID命令

死锁检测2:

Java多线程环境下如何实现死锁

可以看到Thread-1Thread-2都在相互等待对方持有的对象的monitor锁释放。

以上是“Java多线程环境下如何实现死锁”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI