Threads Read-Modify-Write Problem bei Multithreading (philosopher dining problem)

n01sp

Mitglied
Guten Tag,
das Problem ,dass ich momentan mit diesem Code habe, ist dass in dem Code irgendwo ein Read-Modify-Write Problem seien soll. Der Deadlock der momentan existiert ist gewollt ist nicht das Problem. Ich saß nun schon 2 Stunden vor diesem Code und hab überlegt wo der Fehler sein könnte, habe ihn aber nicht gefunden. Vielleicht hat eine von euch Glück ;)

Java:
package de.tuberlin.snet.prog2.ue04.philosophers;

import java.util.Random;

/**
* This class represents a philosopher. He is doing the following (in this order):
*
*/
public class Philosopher implements Runnable {
 
    Chopstick leftChopstick;
    Chopstick rightChopstick;
    String name;
    Random random = new Random();
 
    public Philosopher(String name, Chopstick leftChopstick, Chopstick rightChopstick) {
        this.name = name;
        this.leftChopstick = leftChopstick;
        this.rightChopstick = rightChopstick;
    }

    @Override
    public void run() {
        try {
            while (true) {
                leftChopstick.pickUp();
                System.out.println(this + " picks up his left chopstick");
                // to provoke a deadlock:
//                Thread.yield();
                rightChopstick.pickUp();
                System.out.println(this + " picks up his right chopstick");
                eat();
                rightChopstick.putDown();
                System.out.println(this + " puts down his right chopstick");
                leftChopstick.putDown();
                System.out.println(this + " puts down his left chopstick");
                think();
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
    private void think() throws InterruptedException {
        System.out.println(this + " is thinking");
        Thread.sleep(random.nextInt(1000));
    }
 
    private void eat() throws InterruptedException {
        System.out.println(this + " is eating");
        Thread.sleep(random.nextInt(1000));
    }
 
    public String toString() {
        return name;
    }

}

Java:
package de.tuberlin.snet.prog2.ue04.philosophers;

/**
* This is an implementation of the dining philosophers problem.
* The given number of philosophers is created and started as threads.

*
*/
public class DiningPhilosophersProblem {

    final int NUMBER_OF_PHILOSOPHERS = 5;
    final String[] PHILOSOPHER_NAMES = {"Galilei", "Erasmus", "Dionysios", "Dewey", "Demokrit", "Cicero", "Bacon", "Aristoteles"};
    Chopstick[] chopsticks;
    Philosopher[] philosophers;
 
    public DiningPhilosophersProblem() {
        // prepare chopsticks
        chopsticks = new Chopstick[NUMBER_OF_PHILOSOPHERS];
        for (int i = 0; i < NUMBER_OF_PHILOSOPHERS; i++){
            chopsticks[i] = new Chopstick();
        }
        // prepare philosophers
        philosophers = new Philosopher[NUMBER_OF_PHILOSOPHERS];
        for (int i = 0; i < NUMBER_OF_PHILOSOPHERS; i++){
            String name;
            if (i < PHILOSOPHER_NAMES.length)
                name = PHILOSOPHER_NAMES[i] + "-" + i;
            else
                name = "Philosopher-i";
            philosophers[i] = new Philosopher(name, chopsticks[i], chopsticks[(i+1) % NUMBER_OF_PHILOSOPHERS]);
        }
        // start philosophers
        for (Philosopher phil: philosophers) {
            new Thread(phil).start();
        }
    }
 
    public static void main(String[] args) {
        new DiningPhilosophersProblem();
    }

}
Java:
package de.tuberlin.snet.prog2.ue04.philosophers;

/**
* Represents a chopstick used by the philosophers.
* If a philosopher holds the chopstick and another wants to
* pick it up he has to wait until the chopstick is free.
*
*
*
*/
public class Chopstick {
 
    /** flag showing whether the chopstick is in use */
    boolean inUse;
 
    /**
     * Waits until the chopstick is free and picks it up.
     * @throws InterruptedException
     */
    public void pickUp() throws InterruptedException {
        while (isInUse()) {
            Thread.sleep(100);
        }
        setInUse(true);
    }
 
    /**
     * Puts the chopstick down so i can be used by another philosopher.
     */
    public void putDown() {
        setInUse(false);
    }
 
    /**
     * Sets the {@link #inUse} variable.
     * @param newValue
     */
    private void setInUse(boolean newValue) {
        inUse = newValue;
    }
 
    /**
     * @return true, if the chopstick is in use, otherwise false
     */
    private boolean isInUse() {
        return inUse;
    }

}
 

nvidia

Bekanntes Mitglied
[...]Vielleicht hat eine von euch Glück [...]

Dazu braucht man kein Glück, das ergibt sich aus der verwendung mehreren Threads und der völligen Abwesenheit von Synchronisationmechanismen zwischen diesen. Ich vermute die gewünschte Musterlösung läuft auf die korrekte Verwendung von wait()/notifyAll raus.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
package de.tuberlin.snet.prog2.ue04.philosophers;

/**
* Represents a chopstick used by the philosophers.
* If a philosopher holds the chopstick and another wants to
* pick it up he has to wait until the chopstick is free.
*
*
*
*/
public class Chopstick {

    /** flag showing whether the chopstick is in use */
    boolean inUse;

    /**
     * Waits until the chopstick is free and picks it up.
     * @throws InterruptedException
     */
    public void pickUp() throws InterruptedException {
        while (isInUse()) {
            Thread.sleep(100);
        }
        setInUse(true);
    }

}

Zwei Threads könnten hier "gleichzeitig" (bzw nacheinander, nur hat noch keiner es auf true gesetzt) isInUse() aufrufen, welches beide Male false zurückgibt, obwohl nur einer der beiden es nutzen kann.
 

dayaftereh

Top Contributor
Falls du mehr Informationen suchst, schau mal nach dem Buch Java Concurrency in Practice. Finde das sollte jeder gelesen haben der eine komplexere Multithreading Anwendung umsetzt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
josfe1234 Hilfe access denied ("java.io.FilePermission" " " "read") Java Basics - Anfänger-Themen 12
C System.in.read() Boolsche Werte vergleichen Java Basics - Anfänger-Themen 8
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
V FileInputStream - read() Java Basics - Anfänger-Themen 2
W Input/Output System.in.read erzeugt nicht, was ich will Java Basics - Anfänger-Themen 1
C Input/Output System.in.read() gibt nicht -1 zurück? Java Basics - Anfänger-Themen 3
F Input/Output Blocking file read erzeugen Java Basics - Anfänger-Themen 0
G Thread stoppen mit System.in.read() Java Basics - Anfänger-Themen 13
G comport read Java Basics - Anfänger-Themen 3
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
S Java für Anfänger: Probleme mit read() Java Basics - Anfänger-Themen 20
G Input/Output System.in.read & Scanner Java Basics - Anfänger-Themen 2
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
L Fehler bei "read" ? Java Basics - Anfänger-Themen 4
R ImageIO.read Fehler Java Basics - Anfänger-Themen 4
K Input/Output read/write Java Basics - Anfänger-Themen 15
B Threads Interrupt während Socket.read()? Java Basics - Anfänger-Themen 3
G Problem mit Image.IO.read( File ) Java Basics - Anfänger-Themen 3
C FileInputStream read() Overflow Problem Java Basics - Anfänger-Themen 6
W Koordinaten mit System.in.read() setzen Java Basics - Anfänger-Themen 2
W file read write crash Java Basics - Anfänger-Themen 2
L Read.java Java Basics - Anfänger-Themen 4
F FileReader Methode Read() int? Java Basics - Anfänger-Themen 2
H int : never read - Fehler Java Basics - Anfänger-Themen 3
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
S access denied (java.io.FilePermission read) Java Basics - Anfänger-Themen 3
E Read a file in a package Java Basics - Anfänger-Themen 2
S System.in.read() Java Basics - Anfänger-Themen 2
G Verständnisfrage read() und readLine() Java Basics - Anfänger-Themen 6
C System.in.read() funktioniert nicht Java Basics - Anfänger-Themen 3
G unterschied zwischen in.read() und in.read(byte [] b, int. Java Basics - Anfänger-Themen 3
J System.in.read(): Unhandled exception type IOException Java Basics - Anfänger-Themen 12
P Read, Readline ? Java Basics - Anfänger-Themen 2
B System.in.read() wird übersprungen Java Basics - Anfänger-Themen 5
S System.in.read() mehrmals nacheinander aufrufen Java Basics - Anfänger-Themen 3
F Read access to enclosing field xy is emulated . Java Basics - Anfänger-Themen 2
R frage zur read()-Methode des BufferedReader Java Basics - Anfänger-Themen 2
M Streams, read and write Java Basics - Anfänger-Themen 2
J Wie geht out.read ? Java Basics - Anfänger-Themen 4
L read() (von bufferedReader) abbrechen Java Basics - Anfänger-Themen 5
L unterbrechen von bufferedReader.read() Java Basics - Anfänger-Themen 4
G System.in.read() wartet nicht auf eingabe Java Basics - Anfänger-Themen 1
M FileReader.read(char[]) - Größe des Arrays? Java Basics - Anfänger-Themen 4
R FileInputStream.read() != FileReader.read(). Pls Help Java Basics - Anfänger-Themen 5
D Text-Datei(en) mit der Methode read(bytes[] b) auslesen Java Basics - Anfänger-Themen 4
B Probleme mit Eingaben [System.in.read())] Java Basics - Anfänger-Themen 10
J Keyboard.read... Java Basics - Anfänger-Themen 4
T Anfänger: cannot read: error 1 Java Basics - Anfänger-Themen 8
A JList / toString modify Java Basics - Anfänger-Themen 2
A Instance methods should not write to "static" fields Java Basics - Anfänger-Themen 4
S write(), weshalb verschiedene Ausgaben? Java Basics - Anfänger-Themen 4
K exec.StdIn.Write Java Basics - Anfänger-Themen 7
B Input/Output Socket I/O - outputStream.write(-1) Java Basics - Anfänger-Themen 2
X write() und Zufallszahlen Java Basics - Anfänger-Themen 2
J FileOutputStream write Java Basics - Anfänger-Themen 19
Corben Input/Output FileOutputStream - neue Zeile mit write(10) Java Basics - Anfänger-Themen 6
F FileOutputStream.write Java Basics - Anfänger-Themen 2
M Unterschied append / write aus der Klasse Writer Java Basics - Anfänger-Themen 2
M Audio Stream läuft auf :connection abort: socket write error Java Basics - Anfänger-Themen 2
M Pfad angabe bei getRescource und ImageIO.write Java Basics - Anfänger-Themen 4
hdi Datentypen FileOutputStream#write(int) mit ints? Java Basics - Anfänger-Themen 5
G ImageIO.write() Java Basics - Anfänger-Themen 2
I ImageIO.write(bild, "was gibts da alles", pfad); Java Basics - Anfänger-Themen 6
D FileWriter write? Zeilenumbruch ? Java Basics - Anfänger-Themen 4
S Technik hinter der write Methode Java Basics - Anfänger-Themen 5
C write Java Basics - Anfänger-Themen 3
S Inhalt aus Array auf JSP anzeigen mit bean:write Java Basics - Anfänger-Themen 2
F javax.imageio.ImageIO write methode Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben