synchronized methode rekursiv aufrufen

redbomber

Bekanntes Mitglied
Hi zusammen,

eine kurze Verständisfrage. Wenn ich eine Methode synchronized mache, kann ich diese dann rekursiv aufrufen?

habe hierzu folgendes gefunden:
Da die Sperre während der gesamten Ausführung einer synchronized-Methode nicht mehr abgegeben wird, kann kein anderer Thread in dieser Zeit eine synchronized-Methode auf dem gesperrten Objekt ausführen. Dagegen kann der Thread, der das Sperrobjekt bereits besitzt, sehr wohl weitere geschützte Methoden aufrufen, weil Monitore in Java reentrant sind.
Das bedeutet dass der Thread auch rekursiv die Methode aufrufen kann.

Aber hier ist der Rat der folgende:
The simplest way to avoid deadlock is to follow the rule that says a synchronized method should never call a synchronized method.

Was also stimmt jetzt.
Vielleicht kann ich euch zeigen in welchem Fall ich meine Methode synchronized machen möchte:

Java:
class MyObject{
public synchronized void doCount(){
int count=0;
       for(int i = 0; i < getSubObjectsCount(); i++){
            MyObject object = getSubObject(i);
            count = count + object.doCount();
       }
return count;
}}
 

eRaaaa

Top Contributor
Das erste ist korrekt, sind definitiv reentrant. Vllt. fehlt beim Zweiten einfach nur ein Wort?
"should never call another synchronized method" ? :)
 

Murray

Top Contributor
Die zweite Regel ist sicher nicht falsch: wenn man so vorgeht, vermeidet man Deadlocks. Allerdings gilt der Umkehrschluss eben nicht: wenn man diese Regel nicht beachtet, muss das nicht unbedingt ein Deadlock-Risiko bedeutet.
Was man vermeiden muss, ist aus einem Kontext, der auf einen bestimmten Monitor synchronisiert, in einen anderen Kontext zu springen, der auf einen anderen Monitor synchronisiert. Falls man das nämlich täte und ein anderer Thread das ebenfalls, aber in der umgekehrten Reihenfolge machte, dann würde man evtl. einen Deadlock verursachen.
Ruft man aus einer als synchronized deklarierten Methode diese Methode (oder eine andere, in der gleichen Klasse ebenfalls als synchronized deklarierte Methode) auf, so ist der Monitor ja immer die aktuelle Instanz (und damit bei beiden Aufrufen derselbe).
 
V

vavav

Gast
Die Methode hat den lock und der erneute Eintritt geht schnell und problemlos. Daran ist also nichts falsch.
 
Ich habe eine kleine Frage, die sehr ähnlich gelagert ist wie oben, aber dennoch etwas anders.

Ich habe eine synchronisierte Methode, die der Übersichtlichkeit halber, rekursiv sein sollte. Hier der Codeschnipsel:

Java:
// Im Methodenkopf sind folgende Konstanten definiert:
public static final int U_TURN = -200;
public static final int NORMAL = -300;
public static final int INITIAL = -400;

// Diese Methode meine ich:
	/**
	 * Versucht den nächsten Knoten und die nächste Kante zu sperren.
	 * 
	 * @param start: nächster Knoten
	 * @param end: übernächster Knoten
	 * @param method: Methode, die bestimmt, welcher Case ausgeführt wird.
	 * @return Status, ob das Sperren erfolgreich war.
	 *   1: Alles OK
	 *  -1: Kante gesperrt
	 *  -2: Knoten (und Kante) gesperrt 
	 */
	public synchronized int lockNextSegment(int start, int end, int method) {
		int i = 1; // Nicht spezifiziert
		int edge = edges[start][end].lockStatus();
		switch (method) {

			case INITIAL:
				edges[start][end].lock(CUEdge.LOCK);
				edges[end][start].lock(CUEdge.BLOCK);
				break;

			case U_TURN:
				releaseEdge(end, start);
				i = this.lockNextSegment(start, end, NORMAL);   // <-- Um diesen Aufruf geht es
				break;
	
			case NORMAL:
				/*
				  Das, was in diesem Case passiert, eine ordentliche if-else if-else-Schachtel,
				  die viel zu viel Code enthält, ist für die Frage irrelevant,
				  es werden diverse Stati überprüft und ggf. eine Kante und ein
				  Knoten in einem Graphen gesperrt, bzw. der Status der Aktion
				  in i gespeichert.
				*/
				break;

		}
		updateStreetMap();
		return i;
	}

Ist das so valide oder muss ich irgendetwas anders machen? Falls ja, was?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
J Synchronized Probleme Allgemeine Java-Themen 7
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6
G synchronized Allgemeine Java-Themen 7
J Threads und synchronized Allgemeine Java-Themen 18
hdi synchronized & volatile Allgemeine Java-Themen 10
G zwei mal synchronized Allgemeine Java-Themen 5
J synchronized block mit this und wait() Allgemeine Java-Themen 5
M Verständnis "synchronized" Allgemeine Java-Themen 4
T Thread synchronized Allgemeine Java-Themen 5
Kr0e Synchronized Allgemeine Java-Themen 4
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
R synchronized "gegen sich selbst" Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
R Thread-Problem, und synchronized bringt nix Allgemeine Java-Themen 4
J synchronized (bitte beantworten, urgent! danke) Allgemeine Java-Themen 11
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
G synchronized Klasse? Allgemeine Java-Themen 6
G synchronized + threads Allgemeine Java-Themen 12
A deadlocks bei synchronized Allgemeine Java-Themen 3
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben