1. 哲学家就餐问题描述
本文部分内容来源于此,欲了解详细内容,自行点击查看。
为了不失一般性,我们假设有n个哲学家,围着餐桌思考宇宙、人生问题,每个哲学家面前有一个叉子与之对应,即:共有n个叉子;当哲学家思考一段时间后,他会拿起身边的2个叉子才能进食。进食完毕后,该哲学家放下叉子,继续思考人生、宇宙,如此往复,周而复始。
2. 解决方案
在解决该类问题时,属于竞争资源情形,假设所有哲学家均同时取得其同一方向(如左手边)的叉子时,可能出现了死锁问题。
死锁:死锁是这样一种情形,当每个进程都已经占据某个资源,同时等待另一个资源时,因为条件无法满足而使系统停滞的现象。
活锁:一个线程响应另一个线程的请求,同时另一个线程响应其他线程的请求。线程之间为响应互相的请求而实际未做任何实际工作,从而使得系统陷入饥饿状态。实例:2人A和B在走廊相向而行,A向左边移动让B通过,B向右边移动让A通过,然后反转,周而复始,实际上2人都被对方阻塞。
package com.fqyuan.philosophy;
public class Philosopher implements Runnable {
// The forks on either side of this Philosopher
private Object leftFork;
private Object rightFork;
public Philosopher(Object leftFork, Object rightFork) {
this.leftFork = leftFork;