Synchronized klappt nicht

Mortal_Shadow

Aktives Mitglied
Hi,

ich bin am rumprobieren mit synchronisation gewesen und dabei auf folgendes Problem gestosen:
Java:
public class Speicherproblem {
	
	int counter = 0;

	public static void main(String[] args) {
		Speicherproblem s = new Speicherproblem();
		s.test();
		
	}
	
	public void test(){
		new Thread(new Inkrementor()).start();
		new Inkrementor().run();
		System.out.println(counter);
	}
	
	public synchronized void add(){
		counter++;
	}
	
	public class Inkrementor implements Runnable{		
			@Override
			public void run() {
				for(int i = 1; i <= 10000; i++){
					add();
				}
			}
			
			
			
		}	
	
	
}

Ich erstelle hierbei zwei Inkrementoren, die in verschiedenen Threads counter um eins erhöhen.
Auch wenn sie dies in einer synchronized Methode machen, kommt als result ein zufälliger Wert zwischen
10.000 und 20.000 herraus.
Warum, wie macht mans richtig?
 

jonius

Aktives Mitglied
Ich würde sagen, du musst erst die Runnable-Instanz an den Thread übergeben und bei DIESEM die start()-Methode aufrufen.
 

Atze

Top Contributor
hm, hab jetzt hier am lappi kein eclipse zum testen, aber rein vom gefühl her sieht das n bischen merkwürdig aus. hast du dich vorher mal eigehend mit dem thema concurrency / threads beschäftigt? was soll denn überhaupt rauskommen? 20.000?

also was so auffällt beim drüberschauen:

1. zeile 3 - vielleicht volatile setzen
2. zeilen 12 & 13 - warum die verschiedenen aufrufe? und niemals run() aufrufen, nur start(), sonst ist es eine simple methode, kein multithreading
3. die nested class nicht public machen, sonst braucht sie ne eigene datei. kompiliert dass denn so eigentlich? *grübel*

würd grundsätzlich nochmal über den code nachdenken ;)
 

andiv

Bekanntes Mitglied
Java:
	public void test(){
		new Thread(new Inkrementor()).start();
		new Inkrementor().run();
		System.out.println(counter);
	}

Dein Problem entsteht durch diese Methode. Wenn die Zeile mit dem println ausgeführt wird, dann ist der eine Inkrementor fertig, d.h. counter ist mindestens 10000. Der Fortschritt des parallelen Threads ist aber völlig unklar, er kann zwischen 0 (kam noch nicht zum Zug) und 10000 (ist bereits fertig) liegen.

Funktionieren müsste es so (habs nicht getestet)
Java:
	public void test(){
		Thread t = new Thread(new Inkrementor());
		t.start();
		new Inkrementor().run();
		t.join();
		System.out.println(counter);
	}
 

Mortal_Shadow

Aktives Mitglied
Ich habe jetzt counter volatile gemacht, bringt nichts.

Zu run() vs start().
Schaut nochmal hin, das run() bezieht sich lediglich auf die Klasse Inkrementor, welche von Runnable abgeleitet ist.
Funktionieren tut das so:
Ich starte einen neuen Thread der dann anfängt counter zu erhöhen.
Derweil erhöhe ich im Ursprungsthread counter ebenfalls (new Inkrementor.run()).

Die nested class ist schlecht mit public, sehe ich ein, habe das auch sofort private gemacht.
Auswirkungen auf das Ergebnis hatte dies aber natürlich nicht.


Edit: Es war das fehlende .join().
Danke.
 
Zuletzt bearbeitet:

andiv

Bekanntes Mitglied
1. zeile 3 - vielleicht volatile setzen
volatile ist hier nicht nötig da nur aus synchronized-Blöcken auf counter zugegriffen wird.

2. zeilen 12 & 13 - warum die verschiedenen aufrufe? und niemals run() aufrufen, nur start(), sonst ist es eine simple methode, kein multithreading
Der direkte Aufruf von run ist hier gewollt, zusammen mit dem Thread der die Methode ausführt sind dann nämlich 2 Threads am Werk.

3. die nested class nicht public machen, sonst braucht sie ne eigene datei. kompiliert dass denn so eigentlich? *grübel*
Eine nested class kann gar nicht in eine eigene Datei, dann wäre sie nämlich nicht mehr nested. public ist absolut in Ordnung hier.

Edit: zu langsam ;-)
 

fastjack

Top Contributor
Java:
    new Thread(new Inkrementor()).start();
    new Inkrementor().run();

damit erstellt Du nicht zwei verschiedene Threads, sondern nur einen, richtig wäre:

Java:
    new Thread(new Inkrementor()).start();
    new Thread(new Inkrementor()).start();

jetzt sind es zwei Threads.
 

fastjack

Top Contributor
Das meine ich nicht, der Fakt ist, das das hier:

Java:
new Inkrementor().run();

alleine überhaupt nicht ausreicht, einen Thread zu erzeugen. Es erzeugt lediglich ein Runnable-Objekt, dessen run-Methode Du aufrufst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
A Thread - Synchronized Java Basics - Anfänger-Themen 10
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
O synchronized Java Basics - Anfänger-Themen 39
O synchronized difference Java Basics - Anfänger-Themen 5
E Synchronisierte Methoden vs. Synchronized(lockObject) Block Java Basics - Anfänger-Themen 7
T Was bringt das synchronized bei der Methode? Java Basics - Anfänger-Themen 12
temi Synchronized(Monitor) Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
Shams Synchronized-Schlüsselwort bei Inkrementierung einer statischen Variable Java Basics - Anfänger-Themen 13
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Threads synchronized und wait Java Basics - Anfänger-Themen 2
N Threads Probleme mit synchronized Java Basics - Anfänger-Themen 9
B synchronized threads Java Basics - Anfänger-Themen 17
J Threads Synchronized Java Basics - Anfänger-Themen 6
U synchronized / lock Java Basics - Anfänger-Themen 8
P Arraylist synchronized? Java Basics - Anfänger-Themen 6
X3TitanCore Methoden synchronized bei einer Methode Java Basics - Anfänger-Themen 2
P synchronized methoden Java Basics - Anfänger-Themen 3
B warum schließt synchronized andere threads nicht aus? Java Basics - Anfänger-Themen 7
E synchronized Methoden Java Basics - Anfänger-Themen 3
M synchronized( ref ) Java Basics - Anfänger-Themen 3
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
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S Fragen zu synchronized + Singleton! Java Basics - Anfänger-Themen 10
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
J simple Frage zu synchronized Java Basics - Anfänger-Themen 4
S Threads: synchronized mach nicht was es soll? Java Basics - Anfänger-Themen 6
L Threads und synchronized Java Basics - Anfänger-Themen 8
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
X Synchronized Zugriff ArrayList<E> Java Basics - Anfänger-Themen 6
G synchronized Java Basics - Anfänger-Themen 5
M synchronized variables? Java Basics - Anfänger-Themen 8
B Verständnissfrage synchronized Java Basics - Anfänger-Themen 2
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
C Trotz "synchronized" unerwartete Ausgabe Java Basics - Anfänger-Themen 2
E Synchronized - Methoden in verschied. Klassen Java Basics - Anfänger-Themen 3
C synchronized Java Basics - Anfänger-Themen 2
J Fragen zu Synchronized Java Basics - Anfänger-Themen 6
T synchronized HashMap Java Basics - Anfänger-Themen 7
L Problem mit synchronized und String Java Basics - Anfänger-Themen 2
A Problem mit Threads und synchronized Java Basics - Anfänger-Themen 3
B Was bedeutet synchronized? Java Basics - Anfänger-Themen 8
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Darkherobrine9 Import klappt nicht Java Basics - Anfänger-Themen 7
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
TeacherMrSSimon Schachspiel, Werte in Figur eintragen klappt nicht Java Basics - Anfänger-Themen 23
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
F jsoup einloggen klappt nicht Java Basics - Anfänger-Themen 10
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
nbergmann Umgebungsvariablen einstellen unter Windows 7 klappt nicht Java Basics - Anfänger-Themen 2
C Erste Schritte Insert Into klappt nicht Java Basics - Anfänger-Themen 6
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
L Resourcen laden klappt nicht Java Basics - Anfänger-Themen 2
L Variablen Einheiten umrechen klappt nicht Java Basics - Anfänger-Themen 16
I Schleifendurchlauf ab 2. Durchlauf klappt nicht Java Basics - Anfänger-Themen 10
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
J Datei auslesen klappt nicht Java Basics - Anfänger-Themen 4
K Methoden Pause drücken klappt nur jedes 2. Mal Java Basics - Anfänger-Themen 6
S UserPref und Java Application klappt immer nicht. Java Basics - Anfänger-Themen 2
P Shape Zeichnen klappt nicht - einlesen der Breite/Höhe schon Java Basics - Anfänger-Themen 1
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
J Erste Schritte Zweithöchster Wert eines Arrays herausfinden - warum klappt mein Code nicht? Java Basics - Anfänger-Themen 3
D Telefon programmieren klappt nicht. Java Basics - Anfänger-Themen 5
VfL_Freak Tastaturabfrage auf '@' klappt nicht :-( Java Basics - Anfänger-Themen 1
M Image Download klappt nicht mehr Java Basics - Anfänger-Themen 4
B Erste Schritte Vererbung klappt nicht Java Basics - Anfänger-Themen 24
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
S Date parsen klappt nicht richtig Java Basics - Anfänger-Themen 3
K RGB Wert Heller machen (Dunkler machen klappt) Java Basics - Anfänger-Themen 2
K Einlesen einer txt von BufferedReader klappt nicht wie gewünscht Java Basics - Anfänger-Themen 12
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
H Runden klappt nicht Java Basics - Anfänger-Themen 10
S Dateien/LinkedList/StringBuffer - SOrtierung klappt nicht so ganz Java Basics - Anfänger-Themen 2
K CompareTo zwei mal benutzen klappt nicht. Java Basics - Anfänger-Themen 2
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
J Erste Schritte Bin ein Programm am schreiben klappt aber nicht und weis nicht warum Java Basics - Anfänger-Themen 20
F Dateien lesen klappt nicht Java Basics - Anfänger-Themen 2
Kenan89 Export klappt nicht Java Basics - Anfänger-Themen 2
K Serialisierung: speichern und auslesen, auslesen klappt nicht Java Basics - Anfänger-Themen 14
M Dividieren bei Grafischem Taschenrechner klappt nicht Java Basics - Anfänger-Themen 2
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
K Frame öffnen klappt nicht?! Java Basics - Anfänger-Themen 36
C Methoden Negativer Wert klappt nicht Java Basics - Anfänger-Themen 4
M Datei löschen, klappt nicht Java Basics - Anfänger-Themen 3
J Compiler-Fehler Eclipse .jar Export klappt nicht. Java Basics - Anfänger-Themen 17
A Oracle Verbindungsaufbau klappt nicht Java Basics - Anfänger-Themen 7
GianaSisters Erste Schritte Datei umbennen bzw verschieben klappt nicht Java Basics - Anfänger-Themen 6
Z Speichern in eine .txt klappt.. fast Java Basics - Anfänger-Themen 23
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
K Klassenumbenennung klappt nicht Java Basics - Anfänger-Themen 11
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
N Serialization, Laden klappt nicht wenn die Klasse geändert wurde Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben