哲学家进餐
- 问题描述:
哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,进餐完毕,放下筷子又继续思考。 - 约束条件:
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任一哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。 - 实现:
1、圆桌上有5位哲学家、每两位中间有一个筷子
2、每个哲学家有两件事要做 思考 吃饭(哲学家必须同时拿到两个筷子才能吃饭)
3、哲学家之间并不知道对方何时要吃饭、何时要思考,不能协商制定吃饭、思考策略
4、制定一个拿筷子的策略,使得哲学家不会因为拿筷子而出现死锁乐观锁
死锁的情况如图:
- 解决办法:
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