2016-10-16 2 views
4

Synchronisiert eine Methode, die nur einem Thread zulässt, um sie auszuwerten, bis sie außerhalb des Bereichs einschließlich innerer Methodenaufrufe liegt?Informationen zum Aufrufen von Methoden aus einem synchronisierten Block

Zum Beispiel:

public synchronized void foo(){ 

    if(critical condition){ 
     bar(); // can influence the above condition 
    } 
    baz(); // can influence the above condition 
} 

Kann zwei Threads in bar sein (nehme an ist es nur von hier genannt)?

Was ist, wenn baz von einem anderen Ort im Code als foo aufgerufen werden kann, können dann zwei Threads drin sein?

Antwort

2

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)
+0

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

+0

Ich sah diese Links, bevor ich die Frage stellte, sie haben kein Beispiel für einen Methodenaufruf aus einem Synchronisierungsblock ... – shinzou

+1

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

3

Können zwei Threads in bar sein (angenommen, es heißt nur von hier)?

Ja, vorausgesetzt, sie verwenden verschiedene Objekte, oder eines ist wait() ing.

Was ist, wenn baz von einem anderen Ort im Code als foo aufgerufen werden kann, können dann zwei Threads drin sein?

Ja, synchronized auf eine Methode zu platzieren hat keine Auswirkung auf Methoden, die nicht synchronisiert sind.

+0

Durch verschiedene Objekt Ausführung sein bedeuten Sie eine andere Instanz der Klasse 'foo' ist in? Würde ein Schloss auf "foo" gesetzt werden, würde nur ein Thread in "bar" oder "baz" stehen? – shinzou

+1

@kuhaku Sie können mehrere Instanzen der Klasse haben, die 'foo()' implementiert, wenn Sie nur eine Instanz und nur eine Methode haben, die 'bar()' und 'baz()' aufrufen kann, dann kann nur ein Thread in diesen sein Methoden (es sei denn, Sie verwenden wait()) –

+0

Mehr als eine Methode kann 'baz()' aufrufen und es gibt mehrere Instanzen der umschließenden Klasse, aber sie handeln auf sich selbst nicht auf einander ... – shinzou

Verwandte Themen