Java经典多线程问题——哲学家恰饭

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

Java经典多线程问题——哲学家恰饭

哲学家进餐问题: 五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和恰饭。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,一次只能拿左边或者右边的一根筷子,拿到一根筷子之后才能拿第二根,只有在他拿到两只筷子时才能恰饭。恰饭完毕,放下筷子继续思考。

image.png

这个问题是我们学习多线程的入门问题,接下来我们将对这个问题进行探讨。

首先,如果不对哲学家获取筷子进行限制,则有可能会出现死锁

1. 解法一:锁住所有筷子

解法一的方法是,把所有筷子都给锁住。

当一个哲学家去拿筷子的时候,我们就把所有筷子都锁定,同时阻塞其他再来拿筷子的哲学家,只有等第一个哲学家拿到一双筷子,才允许下一个哲学家去拿筷子。这样就不会出现死锁问题,但这种解法,效率比较差。

2. 解法二:锁住相邻的2支筷子

当一个哲学家去拿他左边筷子的时候,他的右边筷子是不允许其他哲学家拿的,这个方法就是分段加锁,拿左边筷子的时候,先把左右两边的筷子先锁起来,这样就避免了只能拿到一支筷子的问题。

3. 解法三:其中一位科学家是左撇子,从左边拿筷子,其余都从右边拿

当一个哲学家先拿他左边筷子(下面我们称他为左撇子)的时候,其他的科学家有先拿右边的筷子。

1.左撇子拿到筷子,那他左边的哲学家就不能抓到自己右边的筷子,则此时这位哲学家就拿不到一支筷子,他左右的筷子都将给到其他哲学家,4个哲学家拿5个筷子,肯定有一人可以拿到2支筷子。

1.左撇子没拿到筷子,那此时他就是那个一支筷子都没有的任,4个哲学家拿5支筷子,肯定有一人可以拿到2支筷子。

但这个算法,同一时间只能有一个人能拿到两支筷子。

4. 解法四:有一半人是左撇子

我们可以根据解法三的算法稍微改进下,例如:将“有一位左撇子”改为有“有一半左撇子”,而且左撇子和左撇子相隔开来,如果用奇偶表示,就是奇数为右撇子,偶数为左撇子,此时算法效率就优于解法三。

おすすめ

転載: juejin.im/post/7034482885344100365