简单的死锁例子-救人质

死锁核心思想

死锁产生的根本原因就是多个进程之间互相占用了对方的资源不释放,导致所有进程都无法继续推进下去的一种状态

如图所示,进程1拥有 A ,但是它需要 B 才能继续执行下去,正好这个时候进程2在持有 B ,而且它需要 A 才能继续执行。这样一来两者就形成了一个闭环,谁也不让着,抱着自己手头的资源不放手。

救人质事件的流程


其原理同上,坏人抓着人质不肯松手,一定要拿到钱才肯放人,而好人又怕坏人收到钱撕票,一定要先放人,结果两人就你抓着人我拿着钱,互相对峙

代码实现

好人实现

public class GoodBoy {
    public void say(){
        System.out.println("你先给我放人,我就打钱");
    }
    public void get(){
        System.out.println("得到人质");
    } 
}

坏人实现

public class BadBoy {
    public void say(){
        System.out.println("你先给我赎金,我就放人");
    }
    public void get(){
        System.out.println("得到赎金");
    }
}

救人现场

public static void main(String[] args) {
        GoodBoy goodBoy = new GoodBoy();//好人
        BadBoy badBoy = new BadBoy();//坏人
        Object man = new Object();//人质
        Object money = new Object();//赎金
        //坏人线程启动
        new Thread(()->{
            synchronized (man){
                badBoy.say();
                try {
                    Thread.sleep(1000L);//睡眠一下,让好人先把钱拿到,别让坏人直接又拿到人又拿到钱了
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (money){
                    badBoy.get();
                }
            }
        }).start();
        //好人线程启动
        new Thread(()->{
            synchronized (money){
                goodBoy.say();
                synchronized (man){
                    goodBoy.get();
                }
            }
        }).start();
}


#运行结果
#你先给我赎金,我就放人
#你先给我放人,我就打钱

结论

这就是一个简单的死锁例子,遇到这种情况,如果没有外力的作用,程序就会一直保持这个状态,例如这个救人质的例子中,要是有个狙击手偷偷往坏人脑壳上来一发,岂不是就万事大吉了。

posted @ 2021-08-07 19:02  xuxuxuxun  阅读(446)  评论(0编辑  收藏  举报