Immer wenn auf SO eine Frage zur Java-Synchronisation auftaucht, möchten einige Leute darauf hinweisen, dass synchronized(this)
dies vermieden werden sollte. Stattdessen sei eine Sperre einer privaten Referenz vorzuziehen.
Einige der angegebenen Gründe sind:
- Ein böser Code kann Ihr Schloss stehlen (sehr beliebt, hat auch eine "versehentliche" Variante)
- Alle synchronisierten Methoden innerhalb derselben Klasse verwenden genau dieselbe Sperre, wodurch der Durchsatz verringert wird
- Sie legen (unnötigerweise) zu viele Informationen offen
Andere Leute, einschließlich mir, argumentieren, dass synchronized(this)
eine Redewendung, die häufig verwendet wird (auch in Java-Bibliotheken), sicher und gut verstanden ist. Es sollte nicht vermieden werden, da Sie einen Fehler haben und keine Ahnung haben, was in Ihrem Multithread-Programm vor sich geht. Mit anderen Worten: Wenn es anwendbar ist, dann benutze es.
Ich bin daran interessiert, einige Beispiele aus der Praxis zu sehen (kein Foobar-Zeug), bei denen this
es vorzuziehen ist , eine Sperre zu vermeiden, wenn synchronized(this)
dies auch der Fall ist.
Deshalb: sollten Sie es immer vermeiden synchronized(this)
und durch eine Sperre für eine private Referenz ersetzen?
Einige weitere Informationen (aktualisiert, wenn Antworten gegeben werden):
- Wir sprechen über Instanzsynchronisation
- Es werden sowohl implizite (
synchronized
Methoden) als auch explizite Formen vonsynchronized(this)
berücksichtigt - Wenn Sie Bloch oder andere Autoritäten zu diesem Thema zitieren, lassen Sie die Teile, die Sie nicht mögen, nicht aus (z. B. Effektives Java, Punkt zur Thread-Sicherheit: In der Regel ist dies die Sperre für die Instanz selbst, es gibt jedoch Ausnahmen.)
- Wenn Sie eine andere Granularität als die bereitgestellte Sperre benötigen
synchronized(this)
,synchronized(this)
ist diese nicht anwendbar, sodass dies nicht das Problem ist