Dies ist ein äquivalenter Weise, Ihren Code zu schreiben:
public void foo(){
synchronized (this) {
if(critical condition){
bar(); // can influence the above condition
}
baz(); // can influence the above condition
}
}
Da synchronisierte Methoden synchronisieren tatsächlich ihren Körper this
als das Verriegelungsobjekt verwenden.
Also, können zwei Threads foo()
gleichzeitig oder bar()
zur gleichen Zeit ausgeführt werden? Sicher, wenn sie die foo()
oder bar()
von verschiedenen Objekten ausführen.
Auch wird der Anruf an baz()
überhaupt nicht synchronisiert, so dass auch jeweils zwei Fäden die baz()
des einzelnen Objekts in der gleichen Zeit ausgeführt werden können, solange zumindest einer von ihnen wird von außen foo()
aufruft.
Diese beiden Ressourcen sind nützlich für das Verständnis, was die Synchronisation tut und nicht tut, in Java:
Ich empfehle Ihnen, diese Seiten zu überprüfen, weil es einige Stücke sind von Informationen, die nicht zu offensichtlich sind, bis Sie sie überprüfen. Zum Beispiel:
- zwei verschiedene Fäden können nicht zur gleichen Zeit zwei unterschiedliche synchronisiert Methoden eines einzelnen Objekts auszuführen.
- kann ein einzelner Thread zwei verschiedene Methoden synchronisiert des gleichen Objekts (genannt Reentrant Synchronization)
Es sieht also so aus, als würde ich 'bar()' und 'baz()' synchronisieren, wird ein Thread 'this' als Sperre nehmen und sie über' bar', 'baz' bis zum Ende von' foo verwenden 'und nur ein Thread? – shinzou
Ich sah diese Links, bevor ich die Frage stellte, sie haben kein Beispiel für einen Methodenaufruf aus einem Synchronisierungsblock ... – shinzou
Die Sperre, die ein Thread bei der Eingabe von 'foo' erhält, bleibt beim Thread bis zum Beenden von' foo ', auch wenn in' foo' andere Methoden aufgerufen werden. Während der Thread innerhalb der 'Leiste' ist, behält er die Sperre bei, da 'foo' immer noch ausgeführt wird. – MondKin