我必须使用信号量为Java中的餐饮哲学家问题编写解决方案。信号量是“手动”完成的,创建了一个信号量类。看起来像这样:
package principal;
public class Semaforo {
private int valor;
private int esperando;
public Semaforo(int valor) {
this.valor=valor;
this.esperando=0;
}
public synchronized void down() {
if (this.valor >0 ){
this.valor--;
} else {
this.esperando++;
try {
wait();
} catch (Exception e) {
}
}
}
public int getValor() {
return valor;
}
public synchronized void up() {
if (this.valor > 0) {
this.valor++;
} else {
if (this.esperando >0 ) {
notify();
this.esperando--;
} else {
this.valor++;
}
}
}
}
如果我有一个避免并发问题的解决方案,如死锁,饥饿,活锁等等,我会很高兴。我想让每个哲学家在他自己的时间吃饭,但我不知道如何用信号量来实现这一目标。如何用Java中的信号量解决餐饮哲学家的问题?
感谢任何帮助。
答案 0 :(得分:1)
This(第64页)介绍了Tanenbaum的现代操作系统3e 中的餐饮哲学家问题。使用C编程语言的sempahore解决了这个问题。
答案 1 :(得分:0)
你不需要esparanto领域而且你不需要检查“勇敢”的状态'每次你up()可用信号量的数量。我在工作中感到无聊,所以我修剪了你的代码:
private class Semaforo {
private int valor;
public Semaforo(int valor) {
this.valor=valor;
}
public int getValor() {
return valor;
}
public synchronized void down() {
if (this.valor >0 ){
this.valor--;
} else {
try {
wait();
} catch (InterruptedException e) {}
}
}
public synchronized void up() {
this.valor++;
notify();
}
}