Java并发编程实战————死锁状态模拟

概述

死锁状态的大体思路是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁 ,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图:

《Java并发编程实战————死锁状态模拟》

 代码描述

public class DeadLockDemo {
    
    static class A {
        public synchronized void saying() {
            System.out.println(Thread.currentThread().getName() + " A start...........");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new B().saying();
            System.out.println(Thread.currentThread().getName() + " A end.............");
        }
    }
    
    static class B {
        public synchronized void saying() {
            System.out.println(Thread.currentThread().getName() + " B start...........");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new A().saying();
            System.out.println(Thread.currentThread().getName() + " B end.............");
        }
    }
 
    public static void main(String[] args) {
        new Thread(() -> new A().saying(), "t1").start();
        new Thread(() -> new B().saying(), "t2").start();
    }
}

可以看到在线程 t1 调用A对象的saying互斥方法的时候,t1拿到了A对象的锁,而如果想完成saying方法必须去请求B对象的锁才可以执行到B对象的saying互斥方法。线程 t2调用B对象的saying互斥方法的时候,t2拿到了B对象的锁,而如果想完成saying方法必须去请求A对象的锁才可以执行到A对象的saying互斥方法。 

这就导致了死锁的出现,程序会陷入无休止的“死循环”中。

如果没有2秒的睡眠时间,程序会很快因内存溢出而瘫痪:

《Java并发编程实战————死锁状态模拟》

否则程序会不停的循环下去,直到崩溃。

《Java并发编程实战————死锁状态模拟》

 

    原文作者:java锁
    原文地址: https://blog.csdn.net/u014745069/article/details/82079454
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞