Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 22:48

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Java] synchronized Threads Frage

Discussion on [Java] synchronized Threads Frage within the Java forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2012
Posts: 23
Received Thanks: 1
[Java] synchronized Threads Frage

Heyho,

schaue mir gerade synchronized threads an und hab mir mal gedacht ich schreib nen kleines Programm, um zu sehen ob ichs verstanden habe. Und anscheinend versteh ichs noch nicht. Hier mal mein Programm und danach die Erklärung, was ich mit dem Programm bewerkstelligen wollte.

Code:
public class Main 
{
	public String s;
	public long i;
	
	Main(String s, long i)
	{
		this.s = s;
		this.i = i;
	}
	
	public synchronized void foo()
	{
		System.out.println("Start " + s + " Thread!");
		
		try 
		{
			Thread.sleep(i);
			wait();
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
		
		System.out.println("End  " + s + " Thread!");
	}
	
	public static void main(String argv[])
	{
		new Thread()
		{
			public void run()
			{
				Main m = new Main("First", 3000);
				m.foo();
			}
		}.start();
		
		Main m = new Main("Second", 0);
		m.foo();
	}
}
2 threads: Unser Einstiegspunkt, also die main und der zweite thread, der in der main erstellt wird. Nun ührt der zweite thread eine synchronized Methode aus (die möglicherweise Daten enthalten könnte die nur von einem thread gleichzeitig bearbeitet werden sollten). Danach wird die Methode aus dem main thread aufgerufen. Was ich nun gedacht habe ist, dass beim aufruf der Methode von thread 2 die Methode locked, 3 Sekunden wartet und dann durch wait() den lock wieder frei gibt damit der main thread die Methode aufrufen kann... Jedoch wird die Methode von beiden threads sofort aufgerufen? Was habe ich falsch verstanden?^^

p.s.: Vorsicht Deadlock >:3
-Epitaph- is offline  
Old 08/06/2014, 10:56   #2
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Diese Art von synchronized, also das synchronized vor den Methodenrumpf, locked immer auf "this", also auf das aktuelle Objekt, das diese Methode aufruft. Ein lock kann man sich sehr intuitiv so vorstellen:

Sobald du vor eine Methode synchronized schreibst, wird in dieser Klasse ein neues Attribut angelegt, also eine neue Klassenvariable mit dem Namen "locked". Diese Variable kann jetzt die Werte true und flase annehmen. Wenn eine synchronized Methode ausgeführt wird, wird als aller erstes dieses locked auf true gesetzt. Alle anderen Threads warten dann bei diesem Methoden Aufruf desselben Objektes automatisch bis locked wieder auf false gesetzt wurde. Am Ende des Methoden Rumpfes wird locked automatisch wieder auf false gesetzt und dann wird dem anderem Thread gesagt "Schau mal ich bin fertig vielleich is locked jetzt auf false". Der andere Thread prüft es und ruft die Methode auf.

Was dein wait da oben soll verstehe ich nicht, ich kenne wait nur in Verbindung mit Monitoren also würde ich ganz spontan sagen mach es raus und lass die zwei Methoden auf ein und dasselbe Objekt aufrufen, dann sollte es so funktionieren wie du es dir vorgestellt hast. Solltest du dir sicher sein, dss wait an dieser Stelle passt, lass es drin, wie gesagt ich kenne es nr bei Monitoren und net bei synchronized aer wenn du dir sicher bist, dass es passt, lass es drin.
Shadow992 is offline  
Thanks
1 User
Old 08/06/2014, 10:59   #3
 
elite*gold: 0
Join Date: May 2012
Posts: 23
Received Thanks: 1
Ich bin so ein Idiot x3
Es wird ja das Objekt gelocked und da die Methoden bei zwei unterschiedlichen Objekten angewandt wird können beide Methoden gleichzeitig ausgeführt werden...

Thema kann gelöscht werden^^

Quote:
Originally Posted by Shadow992 View Post
Was dein wait da oben soll verstehe ich nicht, ich kenne wait nur in Verbindung mit Monitoren also würde ich ganz spontan sagen mach es raus und lass die zwei Methoden auf ein und dasselbe Objekt aufrufen, dann sollte es so funktionieren wie du es dir vorgestellt hast. Solltest du dir sicher sein, dss wait an dieser Stelle passt, lass es drin, wie gesagt ich kenne es nr bei Monitoren und net bei synchronized aer wenn du dir sicher bist, dass es passt, lass es drin.
Oh garnet gesehen dass du noch vor mir geantwortet hast^^
Ich nehme an mit Monitor meinst einfach ne Methode die etwas beobachtet und dann darauf reagiert? wait() notify() und notifyAll() können ja laut dem Buch was ich lese nur in synchronized Methoden aufgerufen werden. Mit dem wait() wollte ich nur erreichen, dass die erste Methode vor dem zweiten System.out.println stopt und den lock an die zweite Methode übergibt. Nur so zum testen und verstehen halt Normalerweise müsst da ja irgendwo nochn notify rein^^
-Epitaph- is offline  
Reply


Similar Threads Similar Threads
[Java] Sinn von Threads in diesem Fall
04/11/2014 - Java - 8 Replies
Hey... ich arbeite zum ersten mal mit Threads. Arbeite grade an einer Personenverwaltung, sprich einem Programm, dass Daten von Personen aufnimmt und in einer Datei speichert. Dazu habe ich hier zwei Anweisungen: 1. Ein Thread kümmert sich um die Kommunikation mit dem User. 2. Ein zweiter Thread kümmert sich um die Lese- und Schreibvorgänge. Was macht der erste Thread also? Geht es dabei nur um die Eingabe des Nutzers im gesamten Programm? Ich habe im Vorfeld die Aufgabe ohne...
[Java] Problem mit Threads und Lists
08/23/2013 - General Coding - 2 Replies
Also ich habe wie die Überschrift schon sagt habe ich ein Problem mit Threads und Lists. Mit der Funktion List<bla> bla = new ArrayList<bla>(); habe ich für mein seöbstgeschriebenes spiel eine spawnmechanik gebastelt. mein spiel ist dem Age of War | 1000+ Free Flash Games | Andkon Arcade Spiel hier nachempfunden. Das spawnen klappt prima wenn ich allerdings versuche meinen mit implements Runnable erstellten Thread zu nutzen um damit ein Spawndelay wie in dem Flashspiel zu programmieren,...
Java frage
10/20/2012 - Off Topic - 4 Replies
Hey wollte fragen ob Version 7 Update 9 immer noch der virus is
Frage (64/32x Bit -Java)
08/12/2012 - Technical Support - 1 Replies
Hallo, ich habe derzeitig 2 Java Versionen installiert, 32 und 64 Bit, welche Vorteile bietet die 64x Version im Vergleich zu der 32x? Wie kann ich einem Programm zuordnen, welche Version es benutzen soll (wenn dies möglich ist..)? Danke für dei Antwort(en)!
Frage zu Java
07/07/2012 - Technical Support - 3 Replies
Hey, ich war gerade beim aufräumen meines PC's und habe jetzt viele verschiedene Versionen von Java auf meinem PC gefunden. Die Frage nun, welche Version brauch ich welche nicht. http://i.epvpimg.com/sHtZf.png Falls es hilft ich habe Win7 64 Bit. Grüße



All times are GMT +2. The time now is 22:48.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.