Как кодировать столовые философы на Java с помощью семафоров? - PullRequest
0 голосов
/ 31 октября 2011

Мне нужно закодировать решение проблемы столовых философов в 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?

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 31 октября 2011

В этом (стр. 64) рассматривается проблема «Обедающих философов», взятая из современных операционных систем Таненбаума 3e . Проблема решена с семафорами на языке программирования C.

0 голосов
/ 19 ноября 2014

Вам не нужно поле 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();
    }
}
...