Verständnisprobleme mit Thread Locks

tuttle64

Bekanntes Mitglied
Ich habe Verständnisprobleme mit Locks. Angenommen, im Thread A gibt es ein Codeblock der synchronisiert ist. Nun ruft ein anderer Thread B diesen Codeblock auf. Erhält nun Thread B den Lock von Thread A und wenn der Codeblock von A beendet ist, wird der Lock wieder verfügbar?

Es können nur Codeblöcke oder Methoden und keine Variablen synchronisiert werden. Was geschieht aber im folgenden Code mit der Anweisung synchronized (letter)?

Code:
public class RunAdminLetter {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("A");
		AdminLetter a1 = new AdminLetter(sb);
		AdminLetter a2 = new AdminLetter(sb);
		AdminLetter a3 = new AdminLetter(sb);
		a1.start();
		a2.start();
		a3.start();
	}
}

Code:
public class AdminLetter extends Thread {
	private StringBuffer letter ;
	
	public AdminLetter(StringBuffer buf) {
		this.letter = buf;
	}
	
	public void run() {
		synchronized (letter) {
			int charValue = letter.charAt(0);
			for (int i = 0; i < 20; i++) {
				System.out.printf("%s", letter.toString());
			}
			
			letter = letter.replace(0, 1, String.valueOf( (char) (charValue + 1)));
		}
	}
}

Rein semantisch geht es darum, dass die 20 gleichen Buchstaben vollständig ausgegeben werden, bevor der nächste Buchstabe behandelt wird.
 
Zuletzt bearbeitet:
Variablen können nicht synchronisiert werden, in der Tat, nur die darin enthaltenen Objekte

auf Objekte == Monitore gibt es Locks, wenn einer fertig ist darf der nächste rein,
das ist doch das Wesen von synchronized.., wo genau besteht da eine Frage?

eine Übergaberegelung des Locks gibts nicht, auch keine echte Wartereihenfolge,
zumindest der Theorie nach ist bei mehreren Wartenden Zufall, wer dran kommt

edit:
> Es können nur Codeblöcke oder Methoden und keine Variablen synchronisiert werden.

die eine Seite ist der Bereich, welcher Code synchroniert wird, die andere auf welchem Objekt/ Monitor,
davon hängt ab, welche weiteren synchronized-Blöcke welcher weiteren Threads mit drinstecken und ausgeschlossen werden




(mit 333 Postings keine Java-Tags?)
 
Zuletzt bearbeitet von einem Moderator:
eine Übergaberegelung des Locks gibts nicht, auch keine echte Wartereihenfolge, zumindest der Theorie nach ist bei mehreren Wartenden Zufall, wer dran kommt

Gewisse Beeinflussungsmöglichkeiten gibt es schon, z.B. mit Prioritäten. Aber das ist nicht das Thema. Offen ist noch was mit "synchronized (letter)" geschieht, wo letter eine Variable ist.
 
siehe vielleicht noch meinen edit
> Es können nur Codeblöcke oder Methoden und keine Variablen synchronisiert werden.

die eine Seite ist der Bereich, welcher Code synchroniert wird, die andere auf welchem Objekt/ Monitor,
davon hängt ab, welche weiteren synchronized-Blöcke welcher weiteren Threads mit drinstecken und ausgeschlossen werden
ansonsten ist die Rückfrage jetzt ganz schön knapp, das konkrete Ziel der Frage sehe ich nicht, vielleicht hier mit drin:

letter ist eine Variable, auf das Objekt darin wird synchronisiert, da alle Threads denselben StringBuffer haben schließen sich alle gegenseitig aus,
die synchronized-Blöcke aller Thread hier werden einzeln bearbeitet, Reihenfolge egal,
 
Der Beispielcode ist aus dem englischen SCJP-Buch von Sierra/Bates. Das Buch ist gut als Vorbereitung auf die Zertifizierung, aber zum Java lernen eine Katastrophe. Egal, im Regal hatte ich noch das Buch "Parallele und verteilte Anwendungen in JAVA" von R. Oechsel und darin steht auf Seite 36: "Dabei muss hinter dem Schlüsselwort synchronized eine Referenz auf ein Objekt angegeben werden, dessen Sperre zunächst frei sein muss und gesetzt wird, bevor mit der Ausführung des Anweisungsblocks begonnen wird. Am Ende des Anweisungsblocks wird die Sperre wieder aufgegeben".

Somit hat sich meine Frage zu "Es können nur Codeblöcke oder Methoden und keine Variablen synchronisiert werden." gelöst.
 

Zurück
Oben