如何使用信号量在Java中编写用餐哲学家



我必须使用信号量在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中使用信号量的用餐哲学家问题?

这篇文章(第87页)将讨论来自Tanenbaum的现代操作系统3e的用餐哲学家问题。这个问题是用C语言中的信号量来解决的。

您不需要esparanto字段,也不需要在每次up()可用信号量数量时检查'valor'的状态。我工作很无聊,所以我修改了你的代码:

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();
    }
}

相关内容

  • 没有找到相关文章

最新更新