哲学家就餐问题
筷子类
//筷子类
public class Chopstick {
public String name;
// 是否可用
boolean isAvailable;
public Chopstick(String name) {
this.name = name;
isAvailable = true;
}
// 拿起筷子
public synchronized void takeChopstick() {
while (!isAvailable) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isAvailable = false;
}
//放下筷子
public synchronized void dropChopstick() {
isAvailable = true;
notify();
}
}
哲学家类
public class Philosoper extends Thread{
// 哲学家名字
private String name;
private Chopstick leftStick;
private Chopstick rightStick;
public Philosoper(String name, Chopstick leftStick, Chopstick rightStick) {
this.name = name;
this.leftStick = leftStick;
this.rightStick = rightStick;
}
@Override
public void run() {
leftStick.takeChopstick();
System.out.println(name+"拿起了左边的筷子"+leftStick.name);
rightStick.takeChopstick();
System.out.println(name+"拿起了右边的筷子"+rightStick.name);
System.out.println("吃饭");
leftStick.dropChopstick();
rightStick.dropChopstick();
System.out.println("放下筷子");
}
}
测试类
public static void main(String[] args) {
// 定义三只筷子
Chopstick stick1 = new Chopstick("筷子1");
Chopstick stick2 = new Chopstick("筷子2");
Chopstick stick3 = new Chopstick("筷子3");
// 定义三个哲学家
Thread thread1 = new Philosoper("哲学家1", stick1, stick2);
Thread thread2 = new Philosoper("哲学家2", stick2, stick3);
Thread thread3 = new Philosoper("哲学家3", stick3, stick1);
thread1.start();
thread2.start();
thread3.start();
}
结果
哲学家1拿起了左边的筷子筷子1
哲学家2拿起了左边的筷子筷子2
哲学家3拿起了右边的筷子筷子3
一直处于这个状态,每个人都没法用餐,都在等待对方放下筷子,这就是所谓的死锁。
解决死锁办法:
将其中的一个哲学家的左右筷子颠倒一下:
哲学家3把筷子1作为左边筷子,筷子3作为右边筷子,这样当哲学家先拿起筷子1时,发现已经被拿起,就等待,然后哲学家1就能拿起筷子3开始用餐,死锁解决。
解决方法:
public static void main(String[] args) {
// 定义三只筷子
Chopstick stick1 = new Chopstick("筷子1");
Chopstick stick2 = new Chopstick("筷子2");
Chopstick stick3 = new Chopstick("筷子3");
// 定义三个哲学家
Thread thread1 = new Philosoper("哲学家1", stick1, stick2);
Thread thread2 = new Philosoper("哲学家2", stick2, stick3);
Thread thread3 = new Philosoper("哲学家3", stick1 stick3;
thread1.start();
thread2.start();
thread3.start();
}
结果
哲学家1拿起了左边的筷子筷子1
哲学家2拿起了左边的筷子筷子2
哲学家2拿起了右边的筷子筷子3
吃饭
放下筷子
哲学家1拿起了右边的筷子筷子2
吃饭
放下筷子
哲学家3拿起了左边的筷子筷子1
哲学家3拿起了右边的筷子筷子3
吃饭
放下筷子