Synchronized Probleme

JavaNoob1988

Mitglied
Guten Tag Java-Freunde,

könnte mir jemand sagen, weshalb mein Programm immernoch unterschiedliche Werte als Result zurückgibt, obwohl ich eine synchronized-Methode für die Zählvariable verwende?

Java:
public class AppSynchronizedKeyword {

    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public static void main(String[] args) {
        AppSynchronizedKeyword dummyObject = new AppSynchronizedKeyword();
        dummyObject.doWork();
    }

    public void doWork() {

        Thread threadOne = new Thread(new Runnable() {
            public void run() {

                for (int i = 0; i < 1000; i++) {
                    increment();
                }
            }
        });

        Thread threadTwo = new Thread(new Runnable() {
            public void run() {

                for (int i = 0; i < 1000; i++) {
                    increment();
                }
            }
        });

        threadOne.start();
        threadTwo.start();
        System.out.println("Count is " + count);
    }
}

Danke und Grüße
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Erst einmal bitte JAVA tags für deinen Code verwenden.

Was hast du dir denn für ein Ergebnis erwartet?

Ich glaube eher, dass du soetwas in der Art erwartest:

Java:
public class AppSynchronizedKeyword {
  
  private static int count = 0;
  
  public static synchronized void increment() {
    count++;
  }
  
  public static void main(String[] args) {
    AppSynchronizedKeyword dummyObject = new AppSynchronizedKeyword();
    dummyObject.doWork();
  }
  
  public void doWork() {
    
    Thread threadOne = new Thread(() -> {
      
      for (int i = 0; i < 1000; i++) {
        AppSynchronizedKeyword.increment();
      }
    });
    
    Thread threadTwo = new Thread(() -> {
      
      for (int i = 0; i < 1000; i++) {
        AppSynchronizedKeyword.increment();
      }
    });
    
    threadOne.start();
    threadTwo.start();
    try {
      threadOne.join();
      threadTwo.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("Count is " + count);
  }
}

Hier wird die die increment Methode als static deklariert, damit beide Threads diesen erhöhen. Dann warten beide darauf bis sie fertig sind und somit erhälst du immer das selbe Ergebnis.

Wenn du nicht joinst, dann wird sofort nachdem der Thread wegen Multithreading wartet, der Hauptthread wieder aktiv und gibt den derzeitigen Stand des increment aus!
 

JavaNoob1988

Mitglied
Also muss ich immer joinen, sobald ich mehrere Threads habe, die sich eine Arbeit teilen?
Interessant....werde mir die Methode mal genauer durchlesen.

Mich verwirrt das nur, weil ich die Übung aus einem Tutorial habe und der Programmierer dort überhaupt nicht join verwendent. Der benutzt nur die synchronized Methode und bei ihm funktioniert das dann.

Grüße und Danke für deine Antwort
 

Admiral Helmut

Aktives Mitglied
Hallo ;)
Naja es ist denke ich so: Threads sind ja völlig getrennt laufende Ausführungsstränge die vom Schedular CPU Zeit zugeteilt bekommen. Dein MainThread baut 2 andere Threads auf und startet diese dann. Die Arbeit die du diesen Threads in der Run Methode mitgibst laufen nun in diesen seperaten Ausführungssträngen. Dein MainThread macht seine Arbeit ganz normal weiter, also direkt nach dem Start der Threads die Ausgabe des Counters...

Da der Schedular die CPU Zeit jedesmal ein bisschen anders verteilt, je nachdem was gerade auf deiner CPU los ist... wirst du bei jedem Programm start einen anderen Counter kriegen, weil die Worker Threads in der Regel schon etwas CPU zeit bekommen haben und mit dem inkrementieren schon angefangen haben.

Dennoch ist das was Flown schon gemeint hat, der Zugriff auf die AppSynchronizedKeyword Felder über die Threads nicht so schön. Also entweder über static, oder man macht das glaube ich über ein Datenobject, welches man beiden Threads mitgibt.

Verbessert mich bitte, bin selbst Anfänger

Gruß Helmut
 

Flown

Administrator
Mitarbeiter
Was hast du denn für ein Ergebnis erwartet? Vielleicht kannst du den Link zu dem Übungsbeispiel herzeigen.
 

JavaNoob1988

Mitglied
Also so wie ich mein Code reingeschrieben habe, müsste es schon funktionieren. Ich habe das Beispiel aus einem Tutorialvideo. Der Code wurde im Video auch ausgeführt und hat immer das gleiche Ergebnis geliefert. Ich mache es zu Hause nach und es liefert immer wieder unterschiedliche Ergebnisse.
Das mit dem join() hat der Tutorialist (is das ein Wort?) auch zuerst gezeigt, meinte aber auch, dass das eine ungeeignete Implementierung sei....

Deswegen bin ich so verwirrt. Das mit den Threads habe ich schon verstanden @Helmut, aber danke für die detaillierte Erklärung. :)
 

Flown

Administrator
Mitarbeiter
Wenn du einmal bitte den Link zu dem Video posten könntest, dann könnte man nachverfolgen, was er gemacht hat.

Der derzeitige Code, den du am Anfang an geliefert hast, macht genau das, was er soll und liefert immer unterschiedliche Ergebnisse!
 

arilou

Bekanntes Mitglied
'synchronized [Methode]' sorgt dafür, dass immer nur ein Zugreifer zur gleichen Zeit auf die Methode zugreifen kann.
Mehr nicht.
Im Prinzip genügt das, um sich selbst eine Semaphore bauen zu können, womit ein .join() ersetzt werden kann, und tatsächlich nicht mehr nötig ist. Aber das muss man dann von Hand selber bauen/sicherstellen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6
G synchronized Allgemeine Java-Themen 7
J Threads und synchronized Allgemeine Java-Themen 18
hdi synchronized & volatile Allgemeine Java-Themen 10
G zwei mal synchronized Allgemeine Java-Themen 5
J synchronized block mit this und wait() Allgemeine Java-Themen 5
M Verständnis "synchronized" Allgemeine Java-Themen 4
T Thread synchronized Allgemeine Java-Themen 5
Kr0e Synchronized Allgemeine Java-Themen 4
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
R synchronized "gegen sich selbst" Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
R Thread-Problem, und synchronized bringt nix Allgemeine Java-Themen 4
J synchronized (bitte beantworten, urgent! danke) Allgemeine Java-Themen 11
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
G synchronized Klasse? Allgemeine Java-Themen 6
G synchronized + threads Allgemeine Java-Themen 12
A deadlocks bei synchronized Allgemeine Java-Themen 3
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben