Threads und synchronized - Verständnisproblem

X

xhi2018

Gast
Hallo,

ich hab' folgende drei Java Klassen:

Java:
public class FirstThreadProgramm {

   public static void main(String[] args) {
      System.out.println("Programmstart!");
      Counter cnt = new Counter();
      Thread t1 = new Thread(new CountThread("1", cnt));
      Thread t2 = new Thread(new CountThread("2", cnt));
      Thread t3 = new Thread(new CountThread("3", cnt));
      Thread t4 = new Thread(new CountThread("4", cnt));
      t1.start();
      t2.start();
      t3.start();
      t4.start();
      try {
         t1.join();
         t2.join();
         t3.join();
         t4.join();
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }     
      System.out.println("Programmende!");
   }
}
Java:
public class CountThread implements Runnable {

   private String number;
   private Counter counter;
   private Integer i;
   
   public CountThread(String nr, Counter cnt) {
      this.number = nr;
      this.counter = cnt;
      i = 0;
   }

   @Override
   public String toString() {
      return this.getClass().getSimpleName() + " [ " + number;
   }
   
   public void run() {
      while ( counter.increase() ) {
         System.out.println(toString() + " ] - " + counter.toString() );
         i ++;
      }
      System.out.println(toString() + " ] wurde [ " + i.toString() + " ] mal ausgeführt!");
   }
}
Java:
public class Counter {
   
   private Integer counter = 0;
   private final Integer max = 40;
   
   /**
    * @return <b>true</b> wenn der maximale Wert des Counter Objects nicht 
    * erreicht ist ansonsten <b>false</b>
    */
   public synchronized boolean increase() {
      counter = Math.min( max, counter );
      return ( max > counter++ );
   }

   @Override
   public synchronized String toString() {
      return this.getClass().getSimpleName() + " [ " + counter.toString() + " ] ";
   }
}
nun bekomme ich folgende Ausgabe (natürlich sind die Zahlen bei jedem Aufruf unterschiedlich):
Code:
Programmstart!
CountThread [ 1 ] - Counter [ 1 ] 
CountThread [ 1 ] - Counter [ 2 ] 
...
CountThread [ 1 ] - Counter [ 21 ] 
...
CountThread [ 3 ] - Counter [ 38 ] 
CountThread [ 3 ] - Counter [ 40 ] 
CountThread [ 3 ] wurde [ 5 ] mal ausgeführt!
CountThread [ 1 ] - Counter [ 36 ] 
CountThread [ 4 ] wurde [ 0 ] mal ausgeführt!
CountThread [ 2 ] - Counter [ 38 ] 
CountThread [ 2 ] wurde [ 20 ] mal ausgeführt!
CountThread [ 1 ] wurde [ 15 ] mal ausgeführt!
Programmende!

Was ich nicht verstehe ist, dass beim Zähler des Counter Objekts eigentlich immer eine Zahl doppelt ist - im obigen Fall ist es die Zahl 38 - und dafür aber eine Zahl fehlt, was jetzt nicht zu sehen ist, weil ich die Ausgabe gekürzt habe. Die Threads werden aber in Summe - wie gewünscht - zusammen 40 mal ausgeführt.

Aber warum ist das so ???:L Ich dachte mit dem
Code:
synchronized
würde genau so was verhindert, oder verstehe ich da was falsch?
Gruß und vielen Dank für Eure Hilfe / Erklärung!
 

Ebenius

Top Contributor
Das Problem befindet sich in CounterThread...
[java=18] public void run() {
while ( counter.increase() ) {
System.out.println(toString() + " ] - " + counter.toString() );
i ++;
}
System.out.println(toString() + " ] wurde [ " + i.toString() + " ] mal ausgeführt!");
}[/code]
Der Aufruf von Zeile 19 (increase()) ist synchronisiert. Der Aufruf in Zeile 20 (toString()) ist ebenfalls synchronisiert. Zwischen den beiden Zeilen ist aber nichts synchronisiert. Wenn Thread A nun increase() aufruft, dann ein anderer Thread B increase() ruft und dann erst Thread A toString() ruft, dann erhält Thread A die durch Thread B veränderte Ausgabe. Du musst also den ganzen Bereich auf den Counter synchronisieren; das könnte bspw. so aussehen:
[java=18] public void run() {
while ( true ) {
synchronized (counter) {
if (!counter.increase()) {
break;
}
System.out.println(toString() + " ] - " + counter.toString() );
}
i ++;
}
System.out.println(toString() + " ] wurde [ " + i.toString() + " ] mal ausgeführt!");
}[/code]
Ebenius
 
X

xhi2018

Gast
Hallo,
Das Problem befindet sich in CounterThread...

Der Aufruf von Zeile 19 (increase()) ist synchronisiert. Der Aufruf in Zeile 20 (toString()) ist ebenfalls synchronisiert. Zwischen den beiden Zeilen ist aber nichts synchronisiert. Wenn Thread A nun increase() aufruft, dann ein anderer Thread B increase() ruft und dann erst Thread A toString() ruft, dann erhält Thread A die durch Thread B veränderte Ausgabe. Du musst also den ganzen Bereich auf den Counter synchronisieren;

:oops: darauf wäre ich jetzt von selber nicht gekommen - ich werd' das später ausprobieren.
:toll: super & schon mal vielen Dank :applaus:
 
X

xhi2018

Gast
Du musst also den ganzen Bereich auf den Counter synchronisieren; das könnte bspw. so aussehen:
[java=18] public void run() {
while ( true ) {
synchronized (counter) {
if (!counter.increase()) {
break;
}
System.out.println(toString() + " ] - " + counter.toString() );
}
i ++;
}
System.out.println(toString() + " ] wurde [ " + i.toString() + " ] mal ausgeführt!");
}[/code]
prima! genau so funktioniert es wie von mir gewünscht...

super & danke nochmal für Deine Hilfe :toll:
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
B synchronized threads Java Basics - Anfänger-Themen 17
B warum schließt synchronized andere threads nicht aus? Java Basics - Anfänger-Themen 7
I Synchronized Threads Java Basics - Anfänger-Themen 4
R Problem: Threads Synchronized machen Java Basics - Anfänger-Themen 5
M OOP Synchronized Methoden, zugriff aus Threads Java Basics - Anfänger-Themen 4
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
S Threads: synchronized mach nicht was es soll? Java Basics - Anfänger-Themen 6
L Threads und synchronized Java Basics - Anfänger-Themen 8
A Problem mit Threads und synchronized Java Basics - Anfänger-Themen 3
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben