Persönlich denke ich, dass die Antworten, die darauf bestehen, dass die Synchronisierung nie oder nur selten richtig ist, this
falsch sind. Ich denke, es hängt von Ihrer API ab. Wenn Ihre Klasse eine threadsichere Implementierung ist und Sie dies dokumentieren, sollten Sie verwenden this
. Wenn durch die Synchronisierung nicht jede Instanz der Klasse als Ganzes beim Aufrufen ihrer öffentlichen Methoden threadsicher gemacht werden soll, sollten Sie ein privates internes Objekt verwenden. Wiederverwendbare Bibliothekskomponenten fallen häufig in die erstere Kategorie. Sie müssen sorgfältig überlegen, bevor Sie dem Benutzer nicht erlauben, Ihre API in eine externe Synchronisierung einzuschließen.
Im ersteren Fall können mit using this
mehrere Methoden atomar aufgerufen werden. Ein Beispiel ist PrintWriter, bei dem Sie möglicherweise mehrere Zeilen ausgeben möchten (z. B. eine Stapelverfolgung zur Konsole / zum Logger) und sicherstellen möchten, dass sie zusammen angezeigt werden. In diesem Fall ist die Tatsache, dass das Synchronisierungsobjekt intern ausgeblendet wird, ein echtes Problem. Ein weiteres Beispiel sind die synchronisierten Auflistungs-Wrapper. Dort müssen Sie das Auflistungsobjekt selbst synchronisieren, um iterieren zu können. Da die Iteration aus mehreren Methodenaufrufen besteht, können Sie sie intern nicht vollständig schützen.
Im letzteren Fall verwende ich ein einfaches Objekt:
private Object mutex=new Object();
Nachdem ich jedoch viele JVM-Dumps und Stack-Traces gesehen habe, die besagen, dass eine Sperre "eine Instanz von java.lang.Object ()" ist, muss ich sagen, dass die Verwendung einer inneren Klasse oft hilfreicher ist, wie andere vorgeschlagen haben.
Jedenfalls sind das meine zwei Bits wert.
Bearbeiten: Eine andere Sache, wenn this
ich synchronisiere, ziehe ich es vor, die Methoden zu synchronisieren und die Methoden sehr detailliert zu halten. Ich denke, es ist klarer und prägnanter.