线程死锁第五[自学笔记,大神绕路]

对于A和B两个人,A对B说:你先把钱给我,我再把货给你。然而B对A说:你先把货给我,我再把钱给你。这个时候A需要完成的是将货物交给B,B需要做的是将货物交给A,然而他们双方都在等着对方完成对方的任务,这样就会陷入一个死胡同,他们俩永远都不会完成自己的任务。


上述对应多线程中的死锁问题,即两个线程都在等待对方先完成,造成了程序无法继续运行的现象。

class Goods {
    public synchronized void sell(Money money) {
        System.out.println("A对B说:你把钱给我,我就把货给你");
        money.get();
    }

    public synchronized void get() {
        System.out.println("A给了B货物");
    }
}

class Money {
    public synchronized void consume(Goods goods) {
        System.out.println("B对A说:你把货给我,我就把钱给你。");
        goods.get();
    }

    public synchronized void get() {
        System.out.println("B给了A钱");
    }
}

public class Windows implements Runnable {
    Goods goods = new Goods();
    Money money = new Money();
    Windows(){
        new Thread(this).start();
        goods.sell(money);
    }

    @Override
    public void run() {
        money.consume(goods);
    }

    public static void main(String[] args) {
        new Windows();
    }
}

在这里插入图片描述
很显然程序并没有停止运行,但是已经无法完成任务。
虽然死锁只是程序运行时的小概率事件,但是一旦发生了,是非常的棘手。

发布了34 篇原创文章 · 获赞 27 · 访问量 5838

猜你喜欢

转载自blog.csdn.net/weixin_46192593/article/details/105333506