2013-08-31 8 views
10
Class Shared{  
    public void sharedMethod(Object o){ 
      //does something to Object 
    }  
} 

//this is how threads call the shared method 
run(){ 
    sharedInstance.sharedMethod(someObject); 
} 

Jetzt wird o als Parameter an die Methode übergeben. Und die gleiche Methode wird von mehreren Threads parallel aufgerufen. Können wir sicher sagen, dass dieser Code threadsicher ist?Sind Methodenparameter in Java threadsicher?

Es gibt zwei Szenarien:

  • Wenn die someObject
  • unter den Threads gemeinsam genutzt wird, wenn jeder Thread seine eigene Kopie hat someObject
+0

Nein, das kann man nicht sagen. – bmargulies

Antwort

10

Nein Sie nicht sagen können. Methodenparameter sind lokal für Threads, was bedeutet, dass jede ihre eigene Kopie der o Referenzvariable hat. Wenn Sie diese Methode jedoch mit demselben Objekt aus mehreren Threads aufrufen, wird das Argument zwischen ihnen geteilt (denken Sie daran, dass Java pass-by ist) -Wert). In diesem Fall müssen Sie eine explizite Synchronisierung bereitstellen, um Probleme zu vermeiden.

+0

Sie haben zwei verschiedene Kopien der "Referenz" (eine in der aufrufenden Methode, eine in der aufgerufenen Methode - wegen des Pass-by-Wertes), nicht das "Objekt" selbst. Das Ändern der "Referenz" in einer Methode wirkt sich nicht auf die andere aus (z. B. "o = null" in der aufgerufenen Methode hebt das "o" in der Aufrufmethode nicht auf), sondern das "Objekt", auf das sie verweisen beide beziehen sich auf das gleiche Objekt) ist für das andere sichtbar. Daher arbeiten beide Threads am selben Objekt und sind daher nicht Thread-sicher. – user104309

0

Ja, aber nur in zwei Szenarien:

  • wenn jedes Objekt, das Sie passieren in den o Parameter unveränderlich sind,
  • wenn Ihr Code garantiert, dass es höchstens ein Thread arbeitet an das von o referenzierte Objekt.

Ansonsten - keine, da der innere Zustand des Objektes kann gleichzeitig durch mehrere Threads geändert werden.

1

Wenn Sie die gleiche Methode in mehreren Threads aufrufen und es das gleiche Objekt übergeben, ist das Objekt absolut nicht sicher.

1

Wenn Sie einen Thread erstellen, wird ein eigener Stack erstellt (Methode und lokale Variablen).

Zwei Threads haben zwei Stacks und ein Thread teilt seinen Stack niemals mit einem anderen Thread.

Es wird nicht wirksam, bis Sie dies für dasselbe Objekt aufrufen.

+1

@Narenda spricht über Objektparameter (pass by reference), also ist es nicht threadsicher. – camposer

0

Lokale Variablen werden in jedem Thread eigenen Stack gespeichert. Das bedeutet, dass lokale Variablen niemals zwischen Threads geteilt werden. Das bedeutet auch, dass alle lokalen primitiven Variablen Thread-sicher sind.

EDIT

Die LocalObject Instanz in diesem Beispiel wird nicht aus dem Verfahren zurückgeführt wird, noch auf andere Objekte übergeben, die von außerhalb des sharedMethod() Verfahren zugänglich sind.

Jeder Thread, der die sharedMethod()-Methode ausführt, verwendet sein eigenes Objekt o als Parameter.

So scheint die ganze Methode sharedMethod() Thread-sicher zu sein.Die einzige Ausnahme ist natürlich, wenn eine der mit dem Objekt o als Parameter aufgerufenen Methoden die Objekt-Instanz o so speichert, dass sie von anderen Threads aus darauf zugreifen kann.

0

Behandle es so.

Wenn Ihre Threads keine gemeinsamen Ressourcen teilen, ist es unmöglich, Parallelitätsprobleme zu haben. So viel wie wir aus den Informationen wissen, die Sie zur Verfügung gestellt haben, ist das einzige, was hier geteilt werden kann, someObject. Wenn es threadsicher ist oder für jeden Thread kopiert wird, ist Ihr Code im Allgemeinen threadsicher, sofern keine anderen freigegebenen Ressourcen vorhanden sind.

Verwandte Themen