2016-06-14 9 views
0
Public Class A 
{ 
    private Object memberlockObject = new Object(); 

    public doStuffapproach1(){ 

     synchronized(this){ 
       // Do something; 
     } 
    } 

public doStuffapproach2(){ 

     synchronized(memberlockObject){ 
       // Do something; 
     } 
} 

public doStuffapproach3(Object parameterLockObject){ 

     synchronized(parameterLockObject){ 
       // Do something; 
     } 
} 

} 

In dem obigen Code, tun die Methoden doStuffapproach1, doStuffapproach2, doStuffapproach3 die gleiche Art von Blocksynchronisation erreichen oder nicht. Wenn nicht, wie unterscheiden sie sich voneinander. In welchen Szenarien sollte jedes verwendet werden?Was ist der Unterschied zwischen synchronisiert (this) und synchronisiert (ein anderes Objekt)

P.S: Ich verstehe, dass die Synchronisation auf Methodenebene so gut ist wie das Synchronisieren des ganzen Methodenkörpers auf (dies).

+1

Hinweis: Eigentlich sollten Sie vorher etwas recherchieren, bevor Sie Fragen stellen. Und gut, das Zeug ist wirklich überall dokumentiert ... und versuche auch, die Anzahl der verwendeten Tags auf das notwendige Minimum zu reduzieren. – GhostCat

Antwort

2

Wenn Sie das synchronisierte Schlüsselwort verwenden, müssen Sie ein Objekt definieren, das als Monitor verwendet werden soll.

synchronized(this) das aktuelle Objekt als Monitor verwenden

synchronized(otherObject) ein anderes Objekt als Monitor verwenden

Wenn Sie auf das gleiche Objekt in verschiedenen Klassen synchronisieren müssen mindestens einer von ihnen auf etwas anderes this synchronisiert werden muss .

Beachten Sie, dass das Definieren einer Methode wie synchronized implizit auf this synchronisiert wird (wenn die Methode nicht static ist).


Die doStuffapproach1 Verfahren synchronisieren auf diese so jeder Aufruf dieser Methode auf das gleiche Objekt synchronisiert ist. Die doStuffapproach2 funktioniert genau wie doStuffapproach1, weil Sie ein Objekt sperren, das eine eindeutige Instanz im aktuellen Objekt hat.

Die doStuffapproach3 funktioniert anders, weil Sie den Monitor übergeben und hängt davon ab, was Sie als Parameter übergeben.