Thread variablen Sichtbarkeit

Generic1

Top Contributor
Hallo,

ich habe eine kurze Frage, wie macht man das untere Beispiel richtig?

Java:
public class PossibleReordering {
    
    static int x = 0, y = 0;
    static int y = 0, b = 0;
    public static void main(String... args)  throws InterruptedException {
       Thread one = new Thread(new Runnable() {
            public void run() {
                 a = 1;
                 x = b;
                 }
            });
       Thread other = new Thread(new Runnable() {
            public void run() {
                 b = 1;
                 y = a;
                 }
            });
       one.start(); other.start();
       one.join(); other.join();
       System.out.println("x: " + x + ", y: " + y);
       }
    }
 
Moin,

vielleicht erklärst Du mal näher, was Du in diesem Zusammenhang unter "falsch" und "richtig" verstehst :lol:

Gruß
Klaus

[EDIT]
ok, Andi_CH hat da Recht, die Zeile 4 in Deinem Code sollte vermutlich so lauten :
Java:
static int a = 0, b = 0; // 'a' und nicht 'y' !!!
[/EDIT]
 
Zuletzt bearbeitet:
Also falsch ist mal, dass a nirgendwo deklariert ist. Dafür ist y zwei mal deklariert, aber das hat dir der Kompiler sicher schon längst gesagt.
 
Moin,

Andi_CH hat Recht - siehe mein EDIT im ersten Post !

Zudem ist mir aufgefallen :
Java:
in Thread one:
   a = 1;
   x = b;

in Thread other :
   b = 1;
   y = a;  // müsste das hier vlt. "y = b" heißen ?

Wobei mir noch immer nicht wirklich klar ist, was genau der Code eigentlich bewirken soll ???:L

Gruß
Klaus
 
Wobei mir noch immer nicht wirklich klar ist, was genau der Code eigentlich bewirken soll?

Ich nehme an er möchte versuchen ein Reordering von Operationen zu erzeugen. Die JVM darf, unter definierten Bedingungen, Operationen anordnen wie sie es für effizient hält, d.h. angeommen in deinem Code taucht sowas auf

zahl = 1337
done = true

dann ist es möglich das z.B. done = true VOR zahl = 1337 ausgeführt wird.
 
Genau, das reordering ist das Problem und statt dem zweiten mal y sollte natürlich a stehen.

Weiß jemand, wie ich das korrekt machen kann mit 2 Threads?
 
Genau, das reordering ist das Problem und statt dem zweiten mal y sollte natürlich a stehen.

Weiß jemand, wie ich das korrekt machen kann mit 2 Threads?

Korrekt machst du es, wenn die Zuweisungen in den run-Methoden über einen Monitor synchronisiert sind.

Java:
public class PossibleReordering {
    ...    
    static Object o = new Object();
       ...
            public void run() {
              synchronized(o) {    
                 a = 1;
                 x = b;
              }
            }
          });
 ...
 
Juhui - wir landen beim Thema Thread-synchronisation.

Denke mal genau darüber nah - du startest unabhängig laufende Programmteile genannt Thread und die dürfen aber doch nicht ganz unabhängig voneinander alufen, weil es sonst eben nicht definiert ist wann welche Codezeile ausgeführt wird.

Es gibt nun Mechanismen zur Synchronisation. einer ist z.B. hier beschrieben

So mal vereinfacht an einem Beispiel:
Thread eins beginnt zu laufen, bereitet alles vor und wartet nun auf einen Wert von Thread zwei hat alles vorberechnet und signalisiert, dass der Wert bereit ist undläuft gleich weiter. Thread zwei bekommt das Signal, nimmt den Wert entgegen und rechnet weiter.

Kennt jemand eine übersichtliche Seite auf der die unterschiedlichen Mechanismen erläutert werden?
 
Hab ich ja erst danach gefunden und zweitens verstehe ich unter Übersicht halt doch eine Gegenüberstellung verschiedener Mechanismen mit Entscheidungshilfen - aber doch nicht gleich ein Buch 🙂

Ach ja, es ist von 2003 - ich habe keine Ahnung was sich seither in diesem Thema verändert hat
 
IMHO werden da die gängigen Java-Konzepte abgehandelt mit zusätzlichem Fokus aufs Concurrency Package...
Ich sehe da nix vom Concurrency Package, ist ja auch erst in Java 1.5 (2005) dazugekommen, ist imho also ziemlich veraltet, aber deswegen natürlich nicht falsch.

Finde Angelika Langers Webseite immer noch die beste deutschsprachige Referenz.
 
J

So mal vereinfacht an einem Beispiel:
Thread eins beginnt zu laufen, bereitet alles vor und wartet nun auf einen Wert von Thread zwei hat alles vorberechnet und signalisiert, dass der Wert bereit ist undläuft gleich weiter. Thread zwei bekommt das Signal, nimmt den Wert entgegen und rechnet weiter.

Das ist das alte Producer-Consumer Problem.

Natürlich kann man das auf zig verschiedene Arten Lösen (notify-wait, Queues, Barriers). Aber es kommt immer auf eines raus: die unabhängigen Teile müssen synchronisiert werden, wobei das Wort "synchronisert" nicht zwangsläuft was mit dem Schlüsselwort in Java zu tun haben muss. Deshalb sprach ich auch ganz allgemein von "synchroniseren" und "Monitor".
 

Zurück
Oben