哲学家就餐问题及其一种java多线程实现

本文介绍了哲学家就餐问题,这是一个经典的并行编程问题。文章详细讲解了几种经典解法,包括资源分级、仲裁者和服务员角色以及Chandy/Misra方法,并着重阐述了Chandy/Misra方法的Java实现,通过模拟展示了如何避免大规模并发中的死锁和饿死问题。
摘要由CSDN通过智能技术生成

1 概述

哲学家就餐问题,是并行程序中的一个经典问题,其描述如下。

1. 圆桌上有五位哲学家,每两人中间有一个筷子。

2. 每个哲学家有两件事情要做:

    (1) 思考;

    (2) 吃饭。哲学家必须同时拿到两只筷子,才能吃饭。

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

4. 设计一个拿筷子的策略,使得哲学家之间不会因为拿筷子而出现死锁或者活锁。

下图为一个哲学家和筷子的示意图,也是我编的java程序的界面。比较简陋,不过用来示意,还是看得明白的,呵呵。


其中,方块代表哲学家,黄线表示筷子。方块中的数字代表哲学家已经用餐的次数(若一个哲学家的就餐次数一直为0,则是饿死状态),初始化都为0。


2 几种经典解法

1. 资源分级的解法。

为资源(也就是筷子)分配一个偏序结构,所有资源都必须按顺序访问,也即拿起筷子必须按照一定的顺序,比如:先拿编号较小的筷子,再拿编号较大的筷子。放下筷子的顺序则无所谓。这种方法可以避免死锁。例如,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值