线程---死锁-哲学家进餐

哲学家进餐问题描述五个哲学家交替思考和进餐,使用五张椅子、五个碗和筷子。当哲学家拿到两支筷子时才能进餐。约束条件包括等待筷子和不释放已持有的筷子。死锁情况出现时,解决方案包括调整资源获取策略,例如避免同时请求相邻资源。
摘要由CSDN通过智能技术生成

哲学家进餐

  • 问题描述:
     哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,进餐完毕,放下筷子又继续思考。
  • 约束条件:
    (1)只有拿到两只筷子时,哲学家才能吃饭。
    (2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
    (3)任一哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。
  • 实现:
    在这里插入图片描述
1、圆桌上有5位哲学家、每两位中间有一个筷子  

2、每个哲学家有两件事要做      思考      吃饭(哲学家必须同时拿到两个筷子才能吃饭) 

3、哲学家之间并不知道对方何时要吃饭、何时要思考,不能协商制定吃饭、思考策略   

4、制定一个拿筷子的策略,使得哲学家不会因为拿筷子而出现死锁乐观锁 

死锁的情况如图:
img

  • 解决办法:
1、添加一个服务生,只有当经过服务生同意之后才能拿筷子,服务生负责避免死锁发生。

2、每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子。

3、规定每个哲学家拿筷子时必须拿序号小的那只,这样最后一位未拿到筷子的哲学家只剩下序号大的那只筷子,不能拿起,剩下的这只筷子就可以被其他哲学家使用,避免了死锁。这种情况不能很好的利用资源。 

用第二种办法实现:

public class Chopsticks {
   
    private static List<Boolean> chopstick = new ArrayList<Boolean>();//ArrayList 存储五只筷子,均未被使用false
    static {
   
        chopstick.add(false);
        chopstick.add(false);
        chopstick.add(false);
        chopstick.add(false);
        chopstick.add(false);
    }

    //拿到左右两边的筷子
    public synchronized void getchop() {
   
        String id 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值