问题描述
五个哲学家围坐在一张圆桌旁,桌子中央一盘通心面(面假设无限),每个人面前有一只空盘,每两个人之间放一把叉子。为了吃面,每个哲学家都必须获得两把叉子,且只能从自己左边或右边取
存在问题
假如五个哲学家同时拿起右手边的叉子,那么五个人都将等待相邻哲学家手中的叉子,出现“死锁”。PV原语讲解决死锁问题。
java版本实现
未解决死锁
Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};
for(int i=0;i<5;i++){
final int index=i;
new Thread(()->{
while(true){
try {
forks[index].acquire(); //P(index)
forks[(index+1)%5].acquire();//P((index+1)%mod5)
System.out.println("第"+index+"个哲学家在通心粉");
forks[index].release();
forks[(index+1)%5].release();
System.out.println("第"+index+"个哲学家吃完了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
解决死锁
Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};
Semaphore limit = new Semaphore(4);
for(int i=0;i<5;i++){
final int index=i;
new Thread(()->{
while(true){
try {
limit.acquire();
forks[index].acquire(); //P(index)
forks[(index+1)%5].acquire();//P((index+1)%mod5)
System.out.println("第"+index+"个哲学家在通心粉");
forks[index].release();
forks[(index+1)%5].release();
limit.release();
System.out.println("第"+index+"个哲学家吃完了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
PV原语
PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量