Java多线程 哲学家就餐死锁问题四种解决方案

哲学家就餐死锁问题四种解决方案

此文中演示了哲学家就餐问题的死锁代码demo . 下面提供四种解决方案
https://javaweixin6.blog.csdn.net/article/details/108541931

服务员检查 (避免策略)

在哲学家去拿筷子的时候, 由服务员去判断是否会造成五个人都拿着左边筷子的情况, 如果会, 那么服务员就让某个哲学家等一会再拿左边的筷子, 避免了死锁的情况

改变一个哲学家拿筷子的顺序 (避免策略 代码演示)

此策略没有额外的服务员 . 而是 某一个哲学家不是从左边拿筷子, 是从右边拿筷子, 这样就避免了死锁的环路.
例如把此文中的代码
https://javaweixin6.blog.csdn.net/article/details/108541931

做如下的修改, 第一个线程是先拿右边的筷子, 第二个线程先拿左边的筷子

  if (i == 0) {
    
    
                philosophers[i] = new Philosopher(rightChopstick, leftChopstick);
            } else {
    
    
                //初始化哲学家
                philosophers[i] = new Philosopher(leftChopstick, rightChopstick);
            }


再次运行程序, 可以看到没有发生死锁了.

餐票 (避免策略)

餐票方案是指, 如果有五个哲学家 , 那么只给出四个餐票, 总会有一个哲学家是吃不上饭的, 这样也就避免了死锁. 当某个哲学家吃完饭后, 再把餐票还回去.

领导调节策略 (检测与恢复策略)

领导调节策略指的是, 有领导定期的巡视, 如果发现出现了死锁, 那么就会剥夺某一个哲学家手中的筷子 , 释放锁资源, 破坏死锁的四个条件中的不剥夺条件.

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108551420