Synchronisierte Methode ruft sich selbst rekursiv. Ist diese gebrochen?
Den Punkt bei dieser Frage ist zu verdeutlichen, dass Java nicht so funktioniert, wie ich es erwartet habe.
Wie würden Sie erwarten, dass die folgenden code zu Verhalten?
public class SynchTester {
private static SynchTester synchTester;
public synchronized static SynchTester getSynchTester(){
if(synchTester==null){
synchTester = new SynchTester();
}
return synchTester;
}
private SynchTester() {
SynchTester myTester = getSynchTester();
}
public static void main(String[] args) {
SynchTester tester = SynchTester.getSynchTester();
}
}
Ich würde erwarten, dass es zu hängen mit einem deadlock wartet auf die Rekursion abgeschlossen ist, aber stattdessen wirft es StackOverflow. Offensichtlich synchronisiert, nicht blockieren den Zugang zu den gleichen thread.
Ist das ein bug?
- Ich könnte etwas fehlt, aber ich kann nicht sehen, die synchronisiert Schlüsselwort in Ihrem code.
- sorry, schlampig von mir. Verändert die Quelle.
- Synchronisiert Schlösser sind reentrant.
- nennen Sie Ihre Quelle bitte.
- Siehe meine Antwort unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Java synchronized locks sind reentrant.
Quelle: siehe unten auf dieser Seite
Einer synchronisierten Methode muss in der Lage sein, um eine Sperre auf dem monitor-Objekt. Das monitor-Objekt ist die Instanz (oder Klasse eine statische Methode). Ein thread, der bereits den lock nicht brauchen, um es wieder zu bekommen. Ja, das könnte zu einem stackoverflow (harhar).
aus der java tutorials:
Also ich denke das die synchronen Stichwort funktionierte wie erwartet, und eine synchronisierte rekursiven Aufruf ist vollkommen legal (und arbeiten) in java.