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


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

    完美

  • 相关阅读:
    HttpServletRequest对象,自己学习的心得。
    @PathVariable注解的使用和@Requestparam
    微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
    (转)ubuntu 14.04下安装hadoop2.6(伪分布式)
    数据库范式
    C与Python变量的区别
    python3获取当前目录(转)
    最大连续子数组积的线性解法
    最大子数组的线性解法
    windows7下python3.4.3 添加库路径(转)
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15859802.html
Copyright © 2020-2023  润新知