• 多线程之哲学家就餐问题


    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();
        }
    }

    完美

  • 相关阅读:
    安卓虚拟机adb shell sqlite3数据库
    gridview安卓实现单行多列横向滚动
    安卓gridview 网格,多行多列实现
    安卓5.0 沉浸式状态栏
    Acionbar logo
    .replace(R.id.container, new User()).commit();/The method replace(int, Fragment) in the type FragmentTransaction is not app
    导航抽屉图标+文字
    透明ActionBar
    去掉Actionbar下的shadow
    沉浸式导航栏
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15859802.html
Copyright © 2020-2023  润新知