对于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();
}
}
很显然程序并没有停止运行,但是已经无法完成任务。
虽然死锁只是程序运行时的小概率事件,但是一旦发生了,是非常的棘手。