Thread Fehler absichtlich provozieren

abul

Neues Mitglied
Hallo erstmal,
ich möchte meinen Schülern veranschaulichen, dass Fehler die durch Nebenläufigkeit entstehen können durchaus häufig treten. Deshalb habe ich zwei Klassen programmiert.
Beim ersten Durchlauf funktioniert auch alles wunderbar und es treten durchschnittlich ca. 20 Fehler auf. Beim zweiten Durchlauf noch bis zu fünf. Bei allen weiteren Durchläufen tritt jedoch nie ein Fehler auf. Warum ist das so?

Die Point Klasse mit x und y:
Java:
public class Point
{
    // instance variables - replace the example below with your own
    private int x;
    private int y;

    /**
     * Constructor for objects of class Point
     */
    public Point()
    {
        // initialise instance variables
        x = 0;
        y = 0;
    }

    public void setX(int x)
    {
        this.x = x;
    }

    public void setY(int y)
    {
        this.y = y;
    }

    public boolean istXgleichY() {
        //System.out.print("P: ("+x+",  "+y+")");
        return x == y;
    }
}

und die Thread-Test-Klasse:
Java:
public class ThreadUnsynchronized extends Thread {

    private static Point p = new Point();    

    private int pos;

    public ThreadUnsynchronized(int pos) {
        this.pos = pos;
    }

    public void run() {
        for (int i=0;i<100000;i++) {
            p.setX(pos);
            p.setY(pos);
            if (!p.istXgleichY()) {
                System.out.println("\nFehler im Durchgang "+i+": x != y");
            }
        }
        System.out.println(pos+". Thread fertig");
    }
    
    public static void testThreads() {
        Thread t1 = new ThreadUnsynchronized(1);
        Thread t2 = new ThreadUnsynchronized(2);
        Thread t3 = new ThreadUnsynchronized(3);
        Thread t4 = new ThreadUnsynchronized(4);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
 
Es kann sein, dass die Threads dann besser parallel laufen, wenn du eine minimalistische Verzögerung (1, 2, 3ms) zwischen den beiden Set einfügst provozierst du es etwas mehr absichtlich.
 
Zuletzt bearbeitet:
Ok, ganz verstehen warum das so ist, tue ich zwar noch nicht, aber mit ner Pause werden die Fehler zuverlässig provoziert 🙂
Ich habe ein System.out.print("") eingebaut...
Vielen Dank für deine Antwort
Viele Grüße Abul
 
Ganz verstehen kann das wahrscheinlich niemand...

Theoretisch werden die Threads ja schon sortiert und eingereiht für die Abarbeitung. Jedoch obliegt es dem Scheduler (innerhalb des Prozessors), zu sagen, welcher Thread als nächstes darf. Diese Logik ist ungeordnet. Es gibt also keinen theoretischen Beweis, dass dein Skript beim dritten Mal ohne Fehler läuft.

Die Chance ist jedoch gross, dass die beiden Setter und die Ausgabe danach im gleichen Zug bearbeitet werden (kurze Operationen, dicht zusammen, ...)

Mit einer künstlichen Verzögerung Verzögerung fängst du an, deine Threads selber aus dem CPU zu werfen. Deshalb verschiebt sich das dann optimaler gegeneinander.
 

Zurück
Oben