【问题标题】:How to code the dining Philosophers in Java using semaphores?如何使用信号量在 Java 中对餐饮哲学家进行编码?
【发布时间】:2011-10-31 00:02:25
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

  • Wikipedia 列出了几种解决方案以及常见的陷阱。
  • 是的,但这些解决方案与信号量无关。
  • 我看到解决方案“导体”有一个信号量概念,但我不知道如何编码。

标签: java multithreading concurrency concurrent-programming


【解决方案1】:

This(第 87 页)讨论了从 Tanenbaum 的 Modern Operating Systems 3e 中提取的餐饮哲学家问题。这个问题通过 C 编程语言中的信号量来解决。

【讨论】:

  • 错误 404 - 此链接无效
【解决方案2】:

您不需要 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();
    }
}

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 2010-10-11
    • 2017-04-04
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多