Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用信号量在Java中对哲学家进行编码?_Java_Multithreading_Concurrency_Concurrent Programming - Fatal编程技术网

如何使用信号量在Java中对哲学家进行编码?

如何使用信号量在Java中对哲学家进行编码?,java,multithreading,concurrency,concurrent-programming,Java,Multithreading,Concurrency,Concurrent Programming,我必须用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

我必须用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编程语言中的sempahores解决了。

您不需要esparanto字段,也不需要每次增加()可用信号量时检查'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();
    }
}

有几种解决方案以及上概述的常见陷阱。是的,但这些解决方案与信号量无关。我看到解决方案“导体”有一个信号量概念,但我不知道如何编码。错误404-此链接无效