问题描述:
有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一支筷子。哲学家有2个状态,思考或者拿起筷子吃饭。如果哲学家拿到一只筷子,不能吃饭,直到拿到2只才能吃饭,并且一次只能拿起身边的一支筷子。一旦拿起便不会放下筷子直到把饭吃完,此时才把这双筷子放回原处。如果,很不幸地,每个哲学家拿起他或她左边的筷子,那么就没有人可以吃到饭了.
分析问题:
1.有五个哲学家,5个筷子.
2.只有一个哲学家拿到左右两个筷子时,才可以进餐.
3.那么食物就是五个哲学家的共享资源,哲学家要想访问共享
资源,就必须抢到他的左右两个筷子,即要加锁成功.
4.所以就可以想到,五个筷子就是五把锁,
五个哲学家就是五个线程,
每个线程都要去抢夺锁,抢到左右两把锁,就可以吃饭了.
如果我们让每个哲学家先拿到自己左手的锁,
然后再尝试拿右手的锁,
拿到了,就吃饭,
拿不到两把锁都释放.
那么这就会有一个问题,如果每个哲学家同时拿到自己左手的锁,然后尝试去拿右手的锁,那肯定是拿不到的,这就会一直往复下去,谁都吃不了饭,这是一种死锁现象,到最后都会饿死.
方法一:
让其中一个哲学家反着来,他是先拿右手筷子再拿左手筷子
就不会造成同步的振荡的现象了
方法二:
我们把筷子看做临界资源,我们只需让哲学家拿到
它的左右两个筷子就可以了.
1.把五个筷子看作数组的五个元素
元素值为1时表示筷子空闲
元素值为0时表示筷子被