Diese verwenden beide intrinsische Schlösser. Ihr erstes Beispiel ist die Verwendung des intrinsischen Schlosses von lock
, während der zweite das intrinsische Schloss von verwendet this
. Die Frage ist, ob oder nicht this
ist wirklich das, was Sie einschließen möchten, was es oft nicht ist.
Betrachten Sie den Fall, wenn Sie verwenden synchronized(this)
In einer Ihrer Methoden. Sie haben 2 Objekte dieser Klasse, und diese Objekte verweisen auf eine gemeinsame Ressource. Wenn Sie einsperren this
Dann haben Sie keine gegenseitige Exklusivität für diese Ressource. Sie müssen ein Objekt festlegen, auf das alles, was auf die Ressource zugreifen kann, Zugriff hat.
Sperren this
Nur wenn die wichtige Ressource Teil der Klasse selbst ist. Selbst dann ist in einigen Fällen ein Sperrobjekt besser. Wenn es in Ihrer Klasse verschiedene Ressourcen gibt, die sich nicht gegenseitig als Ganzes, sondern einzeln ausschließen müssen, benötigen Sie mehrere Sperrobjekte.
Der Schlüssel ist, wirklich nur zu wissen, wie synchronisiert funktioniert und achten Sie darauf, was Ihr Code tatsächlich tut