synchronized

Status
Nicht offen für weitere Antworten.
G

gast

Gast
Code:
import java.util.*;

class Listing3609 extends Thread{
 	private Vector v;
	
	public Listing3609(Vector v){
		this.v = v;
	}
	
	public void run(){
		while(true){
			synchronized( v ){
				Random r = new Random();
				int tmp = r.nextInt(49)+1;
				v.add(tmp);
				v.notify();
				try{
					Thread.sleep(1500);
				}
				catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		}
	}
}

class Listing3610 extends Thread{
	private Vector v;
	
	public Listing3610(Vector v){
		this.v = v;
	}
	
	public void run(){
		while(true){
			synchronized( v ){
				System.out.println("TeSt");
				while(v.size() < 1){
					try{
						v.wait();
					}
					catch(InterruptedException e){
						e.printStackTrace();
					}
				}
				System.out.println("Daten empfangen: "+(Integer)v.elementAt(0));
				v.removeElementAt(0);
			}		
		}
	}
}

public class Listing3608{
		public static void main(String[] args){
		Vector v = new Vector();
		
		Listing3609 thread1 = new Listing3609(v);
		Listing3610 thread2 = new Listing3610(v);
		
		thread1.start(); thread2.start();
	}
}

das ist mein code-fragment... ich möchte einfach das ein thread einen wert erstellt und dem anderen mitteilt das es nun weiter geht. warum funktioniert das nicht oO wo liegt mein fehler?
 

Marco13

Top Contributor
In einem synchronized(v) - Block kann immer nur ein Thread sein. Wenn zufällig zuerst der erste Thread losläuft, kommt der zweite nie in seinen Synchronized-Block (weil der erste ja ewig auf v synchronized ist). Und selbst wenn er dazu kommt: Der erste Thread gibt ja nie das "v" wieder frei (ALLES was er macht passiert ja synchronized auf v)

Einfachste Abhilfe: Die "}" aus Zeile 23 um 6 Zeilen nach oben verschieben :)
 
G

gat

Gast
Marco13 hat gesagt.:
In einem synchronized(v) - Block kann immer nur ein Thread sein. Wenn zufällig zuerst der erste Thread losläuft, kommt der zweite nie in seinen Synchronized-Block (weil der erste ja ewig auf v synchronized ist). Und selbst wenn er dazu kommt: Der erste Thread gibt ja nie das "v" wieder frei (ALLES was er macht passiert ja synchronized auf v)

Einfachste Abhilfe: Die "}" aus Zeile 23 um 6 Zeilen nach oben verschieben :)

vielen dank :) hat mir wirklich geholfen. ich hätte aber noch eine frage. wenn jetzt der eine thread notify() ausführt macht ja der andere thread nach .wait() weiter. heißt das dann, das der eine Thread seine bearbeitung bei notify() forsetzt und der andere bei wait()? das würde ja heißen das (theoretisch) 2 threads auf den synchronized(v) block gleichzeitig zugreifen können. wiederspricht das nicht dem, wofür synchronized eigentlich gedacht ist? oder was habe ich da falsch verstanden.

gruß
 
S

SlaterB

Gast
es ist zunächst nur der aufrufenen Thread weiter im synchronized-Block,
der waintende Thread wird zwar aufgeweckt, hat dann aber die Position wie ein Thread, der als zweiter zum synchronized kommt,
muss also zunächst mal warten, kann aber sofort rein, wenn der Block frei wird (es geht aber direkt hinter dem wait()-Befehl weiter, ja),
aus passivem wait() wird also aktives syncronized-Warten ;)
 
G

gast

Gast
SlaterB hat gesagt.:
es ist zunächst nur der aufrufenen Thread weiter im synchronized-Block,
der waintende Thread wird zwar aufgeweckt, hat dann aber die Position wie ein Thread, der als zweiter zum synchronized kommt,
muss also zunächst mal warten, kann aber sofort rein, wenn der Block frei wird (es geht aber direkt hinter dem wait()-Befehl weiter, ja),
aus passivem wait() wird also aktives syncronized-Warten ;)

vielen dank :)

also wenn ich das richtig verstanden habe, heißt das es wird erst nach wait() fortgesetzt wenn der synchronized block von dem notify() aufgerufen wurde seine "opperationen" beendet hat. er wird durch notify() also aufgeweckt aber nicht zwingend sofort fortgesetzt. stimmt das?

gruß
 
Status
Nicht offen für weitere Antworten.
Ä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
M Synchronized klappt nicht Java Basics - Anfänger-Themen 11
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
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

Ähnliche Java Themen

Neue Themen


Oben