1.背景
哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题。
问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。
哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。
上述问题会产生死锁的情况,当5个哲学家都拿起自己左手边的筷子,准备拿右手边的筷子时产生死锁现象。
问题解决
1.其中一个人改变拿筷子的顺序
2.代码
people对象:
package com.ldp.demo02; import com.common.MyThreadUtil; import lombok.extern.slf4j.Slf4j; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 02/01 9:31 * @description */ @Slf4j public class People extends Thread { private String name; private String leftChopsticks; private String rightChopsticks; public People(String name, String leftChopsticks, String rightChopsticks) { this.name = name; this.leftChopsticks = leftChopsticks; this.rightChopsticks = rightChopsticks; } @Override public void run() { this.setName(name); while (true) { eat(leftChopsticks, rightChopsticks); } } /** * 吃饭功能 * 有严重的死锁问题 * * @param leftChopsticks * @param rightChopsticks */ public void eat(String leftChopsticks, String rightChopsticks) { synchronized (leftChopsticks) { //log.info("获得左手筷子:" + leftChopsticks); synchronized (rightChopsticks) { //log.info("获得右手筷子:" + rightChopsticks); log.info("吃饭........"); // 思考1秒 MyThreadUtil.sleep(1); } } } }
测试代码:
package com.ldp.demo01; import com.ldp.demo02.People; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 02/01 9:14 * @description <p> * 哲学家就餐问题: * 哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题。 * <p> * 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。 * 哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。 * 上述问题会产生死锁的情况,当5个哲学家都拿起自己左手边的筷子,准备拿右手边的筷子时产生死锁现象。 * 问题解决 * 1.其中一个人改变拿筷子的顺序 * </p> */ public class Test10Eat { public static void main(String[] args) { // 筷子 String chopsticks01 = "筷子01"; String chopsticks02 = "筷子02"; String chopsticks03 = "筷子03"; String chopsticks04 = "筷子04"; String chopsticks05 = "筷子05"; // 人与位置的关系 People people1 = new People("p1", chopsticks01, chopsticks02); People people2 = new People("p2", chopsticks02, chopsticks03); People people3 = new People("p3", chopsticks03, chopsticks04); People people4 = new People("p4", chopsticks04, chopsticks05); // People people5 = new People("p5", chopsticks05, chopsticks01); // 其中一个人背着桌子坐,即改变左右手拿筷子的顺序可以解决死锁问题 People people5 = new People("p5", chopsticks01, chopsticks05); // 启动线程 people1.start(); people2.start(); people3.start(); people4.start(); people5.start(); } }