warum schließt synchronized andere threads nicht aus?

braindoc

Mitglied
Hallo zusammen,

ich habe probleme synchronized anzuwenden. ich hatte auch einen anderen thread dazu gefunden (http://www.java-forum.org/java-basics-anfaenger-themen/74919-threads-synchronized-mach.html) aber der war geschlossen, deswegen habe ich mal einen neuen thread aufgemacht... ich denke ich habe ein ähnliches Problem wie in dem Oben genannten Tread, aber ich komme noch nicht so ganz dahinter....

folgender Code

Java:
class P implements Runnable {
   Thread t;

   P(int id) { //Konstruktor
      t = new Thread(this, "P"+id);
      System.out.println("Child thread created:" + t);
      t.start(); 
   }

   public void run() { 
       int counter=0;
       while(counter<1)
       {
        task1();
        task2();
        task3()
        task4();
        counter++;

       }

       System.out.println("child killed");
   }

   public synchronized void task2()
       {
            System.out.println(Thread.currentThread().getName()+" started sync-area");
            doSth(); //beschäftigung
            System.out.println(Thread.currentThread().getName()+"   stopped sync-area");
       }

   public void task1(){
      //...
   }

   public void task3(){
      //...
   }
   
   public void doSth()
   {
    // hier steht die beschäftigung (mehrere verschachtelte schleifen, aber kein sleep oder wait!)
   }
}

class Main {
   public static void main(String args[]) {
      new P(1); // create a new thread
      new P(2); // create a new thread
      new P(3); // create a new thread
      new P(4); // create a new thread
      new P(5); // create a new thread
   }
}

in der Ausgabe steht in ungefäht folgendes:

P1 started sync-area
P2 started sync-area
P3 started sync-area
P4 started sync-area
P5 started sync-area
P1 stopped sync-area
P2 stopped sync-area
P3 stopped sync-area
P4 stopped sync-area
P5 stopped sync-area

(plus noch einige andere ausgaben aus anderen Methoden...)

?! aber task2 ist doch synchronized, sollte also nur von einem Thread gleichzeitig ausgeführt werden? wie kann es sien das er die Methode frühlich parallel ausführen lässt?
in dem o.g. Thrad wird vorgeschlagen das man auf ein objekt oder so ähnlich synchronisieren soll. Mir ist nur noch nicht so ganz klar warumm? Mit [c]public synchronized void task2()[/c] habe ich doch gesagt das die methode nicht nebenlaufig ausgeführt werden darf?

Vielen Dank für die Tipps... braindoc
 

braindoc

Mitglied
oaky, vielen Dank für die Erklärung.

Aber ich stehe auf dem Schlauch. Ich habe sogar genau das verlinkte Buch vor mir leigen ...

Vieleicht kann mich jem. auf meinen Denkfehler hinweisen:

Synchronized verhindert doch das nebenlaufig auf die Methode zugegriffen wird. Und nebenläufige Zugriffe erhalte ich doch nur wenn ich mehrere unterschiedliche Threads erstelle, oder? Also muss ich doch 5 unterschiedliche Threads erstellen!

Wenn ich dich richtig verstanden habe, kann synchronized nur innerhalb eines Threads arbeiten und nicht mit unterschiedlichen Threads ("Da hier also auf unterschiedliche Objekte bzw. deren Methode zugeriffen wird, hat das synchronized keine Auswirkung.")

Was hat es denn für einen Sinn wenn synchronized nur innerhalb eines Threads synchronisiert?! da kann doch garkeine Nebenlaufichkeit entstehen?


ich hoffe irgendjemand versteht meine denkensweise :-/
 

eRaaaa

Top Contributor
Normal hast du ja das synchronized nicht in den Thread-Methoden, sondenr eben in den Klassen/Objekten die du den Threads beifügst / mit welchen die Threads arbeiten
Wenn du z.B. einen Stack hast der von mehreren Threads bearbeitet werden soll, dann müssen eben unter Umständen die Methoden des Stacks synchronisiert sein!
Wie Michael... schon schrieb, hast du hier aber verschiedene P-Objekte!
Vlt wird es für dich klarer wenn wir deinen Code etwas umändern:
In Zeile 3 einfügen
Java:
	static Object lock = new Object();

Und die Methode task2 wie folgt ändern
Java:
	public void task2() {
		synchronized (lock) {
			System.out.println(Thread.currentThread().getName()
					+ " started sync-area");
			doSth(); // beschäftigung
			System.out.println(Thread.currentThread().getName()
					+ "   stopped sync-area");
		}
	}

hier wird jetzt explizit auf das Objekt lock der Monitor gelegt :)
Da bei allen Objekten das Objekt lock das selbe ist (da static) sollte das dann so auch funktionieren.
In deinem Code, also bei synchronized in der Methodensignatur, sagst du ja, dass der Monitor auf this(also auf der p-Instanz gelegt werden soll)
Aber eig. steht das auch alles im og.g. Link, von daher :bahnhof:
 

Michael...

Top Contributor
Da hast Du mich falsch verstanden. Dein Konstrukt ist zum Testen von synchronized etwas "ungünstig".
Du erzeugst fünf Runnable Objekte, deren run zwar in verschiedenen Threads läuft, die aber nur auf ihre eigene task2 Methode zugreifen.
D.h. es wird nirgends versucht gleichzeitig auf ein und die selbe task2 Methode zu zugreifen, da jeder Thread seine "eigene" Methode ausführt.

Um die Auswirkung von synchronized nachzuvollziehen. Müsstest Du ein Objekt mit einer synchronized Methode erstellen und dieses allen fünf Threads übergeben.
 

braindoc

Mitglied
oaky, nochmal danke das ihr euch so mühe gebt, ich denke es dämmert - aber auch nur das. Hell ist es irgendwie noch nicht geworden...

wenn ich mehrere Instanzen/Objekte erzeige haben die alle ihre eigenen task2-methoden. Soweit klar. Und genau bei diesen einzelnen task2 Methoden will ich ja verhindern das sie nebenlaufig abgearbeitet werden. :(
Der Vorschlag mit dem Lock objekt leuchtet soweit (eigendlich) auch ein.

@ eRaaaa
"Normal hast du ja das synchronized nicht in den Thread-Methoden, sondenr eben in den Klassen/Objekten die du den Threads beifügst / mit welchen die Threads arbeiten"
--> vieleicht liegt da ja mein Fehler. Ich dachte das task2 eine Methode eines P-Objekts ist. ???:L Und mit diesen Objekten arbeiten doch die Threads, das scheint ja genau der punkt zu sein den ihr mir gerade beibringen wollt (unterscheidliche Threads, unterschiedliche Objekte)?

@ Michael
"Dein Konstrukt ist zum Testen von synchronized etwas "ungünstig"."
--> offensichtlich :) Aber was währe dann eine günstigeres Konstrukt? In dem Inselbuch steht [c] synchronized void foo() { i++; } [/c], womit verhindert wird das das nicht-atomare i++ nicht nebenlaufig ausgeführt wird, damit es zu keinen Race-conditions kommt. - Das scheit aber mit [c] synchronized void task2() { ... } [/c] nicht zu funktionieren ?! ???:L

"es wird nirgends versucht gleichzeitig auf ein und die selbe task2 Methode zu zugreifen"
--> soweit verstanden, es sind unterschiedliche Methoden, da unterschieldiche Threads. Aber wenn jeder Thread seine eigene Methoden hat, kann es ja garnicht zu ungewollten nebenlaufichkeitsefekten kommen. Aber wozu kann ich Methoden dann mit synchronized versehen?

Ich will euch nicht unnötig arbeit machen, aber könnte jem. vieleicht so umändern das synchronized methoden Sinn machen?
 

eRaaaa

Top Contributor
:autsch:
Java:
class P {
	
	public synchronized void task2() {
		System.out.println(Thread.currentThread().getName()
				+ " started sync-area");
		doSth(); // beschäftigung
		System.out.println(Thread.currentThread().getName()
				+ "   stopped sync-area");
	}

	public void doSth() {
		// hier steht die beschäftigung (mehrere verschachtelte schleifen, aber
		// kein sleep oder wait!)
	}
	
	public static void main(String[] args) {
		final P p = new P();
		
		//erstelle drei threads die mit dme p objekt arbeiten
		new Thread(new Runnable() {
			public void run() {
				p.task2();
			}
		}).start();
		new Thread(new Runnable() {
			public void run() {
				p.task2();
			}
		}).start();
		new Thread(new Runnable() {
			public void run() {
				p.task2();
			}
		}).start();
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
J CMD schließt sich automatisch Java Basics - Anfänger-Themen 5
Hanschyo Programm schließt sich einfach Java Basics - Anfänger-Themen 2
A Dialog schließt erst nach 2x Klicken auf Schließen Java Basics - Anfänger-Themen 2
B Konsole schließt sich sofort Java Basics - Anfänger-Themen 8
M Input/Output Scanner schließt nicht Java Basics - Anfänger-Themen 2
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
M DOS-Ausgabefenster schließt nach Hundertstelsekunde - Wie kann ich das abschalten? Java Basics - Anfänger-Themen 5
P FileDiaglog schließt nicht Java Basics - Anfänger-Themen 9
R windowclosing - fenster schließt immer trotz abfrage Java Basics - Anfänger-Themen 2
G JWindow schließt mit dispose() nicht richtig Java Basics - Anfänger-Themen 2
A Fenster bleibt leer und schließt sich nicht Java Basics - Anfänger-Themen 26
W JComboBox- Auswahl schließt komplettes Fenster Java Basics - Anfänger-Themen 10
G Programm schließt sich nicht Java Basics - Anfänger-Themen 5
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
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
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
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
C Int an andere Klasse übergeben Java Basics - Anfänger-Themen 26
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
E Warum lässt sich eine Klasse nicht starten, wenn eine andere Klasse in dem Modul fehlerhaft ist? Java Basics - Anfänger-Themen 1
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
A Selbe Aufgaben stellung, andere Lösung Java Basics - Anfänger-Themen 7
S ArrayList in andere Klasse übernhemen Java Basics - Anfänger-Themen 5
Y Java andere Klasse aufrufen Java Basics - Anfänger-Themen 6
J Combobox füllen mit Wertausgabe von andere Klasse Java Basics - Anfänger-Themen 3
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
E Methode soll andere Methode der selben Klasse aufrufen Java Basics - Anfänger-Themen 28
B Mit webservice a) String auf Webseite ausgeben b) Weiterleitung auf andere Seite Java Basics - Anfänger-Themen 10
J Übergabe von Parametern an andere Methoden Java Basics - Anfänger-Themen 5
scratchy1 Kann man in einer Methode eine andere aufrufen? Java Basics - Anfänger-Themen 2
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
R Weitergabe von Arrays aus Methoden in andere Klasse Java Basics - Anfänger-Themen 5
M JTable an andere Klasse übergeben Java Basics - Anfänger-Themen 2
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
W Klassen greifen auf andere Klassen zu Java Basics - Anfänger-Themen 1
L Klassen Objekt aus einer Warteschlange in eine andere übergeben, geht nicht? Java Basics - Anfänger-Themen 6
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
F OOP Instanz einer Klasse an eine andere weitergeben Java Basics - Anfänger-Themen 16
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
S verweis auf andere Klasse fehler Java Basics - Anfänger-Themen 3
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben