哲学家就餐问题-对线程死锁的理解
两个线程的死锁问题:
- 线程1 首先占有对象1,接着试图占有对象2
- 线程2 首先占有对象2,接着试图占有对象1
- 线程1 等待线程2释放对象2
- 与此同时,线程2等待线程1释放对象1
此时就会一直等待下去,直到天荒地老,海枯石烂,山无棱 ,天地合。。。
史上著名哲学家吃饭问题:
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、
右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
Java代码演示:
SiSuo.java
package DuoXianCheng;
public class SiSuo {
//哲学家就餐问题
//哲学家有了左手边的筷子,想取得右手边的筷子
public static void main(String[] args) {
final Chopstick c1 = new Chopstick("筷子1");
final Chopstick c2 = new Chopstick("筷子2");
final Chopstick c3 = new Chopstick("筷子3");
//哲学家1有筷子1,想取得筷子2
Thread philosopher1 = new Thread() {
public void run() {
synchronized (c1) {
System.out.println("哲学家1已经占有" + c1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("哲学家1试图占有" + c2);
System.out.println("哲学家1等待中。。。");
synchronized (c2) {
System.out.println("哲学家1获得" + c2);
}
}
}
};
//哲学家2有筷子2,想取得筷子3
Thread philosopher2 = new Thread() {
public void run() {
synchronized (c1) {
System.out.println("哲学家2已经占有" + c2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("哲学家2试图占有" + c3);
System.out.println("哲学家2等待中。。。");
synchronized (c3) {
System.out.println("哲学家2获得" + c3);
}
}
}
};
//哲学家3有筷子3,想取得筷子1
Thread philosopher3 = new Thread() {
public void run() {
synchronized (c3) {
System.out.println("哲学家3已占有" + c3);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("哲学家3试图占有" + c1);
System.out.println("哲学家3等待中 。。。。");
synchronized (c1) {
System.out.println("哲学家3获得" + c1);
}
}
}
};
philosopher1.start();
philosopher2.start();
philosopher3.start();
}
}
Chopstick.java
package DuoXianCheng;
public class Chopstick {
private String name;
public String getName() {
return name;
}
public void setChopstick(String name) {
this.name = name;
}
public Chopstick(String name) {
super();
this.name = name;
}
public String toString() {
return getName();
}
}