2013-08-31 11 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); 
} 

Teraz parametr o jest przekazywany jako parametr metody. Ta sama metoda jest wywoływana przez wiele wątków równolegle. Czy możemy bezpiecznie powiedzieć, że ten kod jest bezpieczny dla wątków?Czy Parametry metody wątek bezpieczne w Javie?

Istnieją dwa scenariusze:

  • Jeśli someObject jest dzielona pomiędzy nićmi
  • Jeśli każdy wątek ma własną kopię someObject
+0

Nie, nie możesz tego powiedzieć. – bmargulies

Odpowiedz

10

No nie można powiedzieć. Parametry metody są lokalne dla wątków, co oznacza, że ​​każdy ma swoją własną kopię zmiennej referencyjnej o, ale jeśli wywołasz tę metodę z tym samym obiektem z wielu wątków, wówczas argument zostanie udostępniony między nimi (pamiętaj, że Java to pass-by -wartość). W takim przypadku musisz zapewnić wyraźną synchronizację, aby uniknąć problemów.

+0

Masz 2 odrębne kopie "odniesienia" (jeden w wywołaniu metody, jeden w wywołanej metodzie - z powodu wartości przejazdu), a nie sam "obiekt". Zmiana "odwołania" w jednej metodzie nie ma wpływu na drugą (na przykład 'o = null' w wywołanej metodzie nie unieważnia metody' o' w wywołaniu), ale zmienia "obiekt", do którego się odnoszą (w tym przypadku oba odnoszą się do tego samego obiektu) jest widoczny dla drugiego. W związku z tym oba wątki działają na ten sam obiekt, a zatem nie są bezpieczne dla wątków. – user104309

0

Tak, ale tylko w dwóch scenariuszach:

  • jeśli każdy przedmiot można przejść na parametr o jest niezmienne,
  • jeśli kod gwarantuje, że istnieje co najwyżej jeden wątek pracy na obiekt odwołuje o.

Inaczej - nr, ponieważ wewnętrzny stan obiektu może być zmieniony przez wielu wątków jednocześnie.

1

Jeśli wywołasz tę samą metodę w wielu wątkach i przekazujesz ją temu samemu obiektowi, ten obiekt jest absolutnie , a nie bezpieczny.

1

Po utworzeniu wątku zostanie utworzony własny stos (metoda i zmienne lokalne).

Dwa wątki będą miały dwa stosy, a jeden wątek nigdy nie będzie dzielił stosu z żadnym innym nici.

To nie wpłynie aż dzwonisz na ten sam obiekt.

+1

@Narenda mówi o parametrach obiektu (przekazywanie przez odniesienie), więc nie jest bezpieczny dla wątków. – camposer

0

zmienne lokalne są przechowywane w każdy wątek własnego stosu. Oznacza to, że zmienne lokalne nigdy nie są współużytkowane przez wątki. Oznacza to również, że wszystkie lokalne prymitywne zmienne są bezpieczne dla wątków.

EDIT

Instancja LocalObject w tym przypadku nie są zwracane ze sposobu, nie jest również przekazywany do innych obiektów, które są dostępne od zewnątrz sposobu sharedMethod().

Każdy wątek wykonujący metodę sharedMethod() użyje jako parametru obiektu własnego obiektu o.

Więc, cała metoda sharedMethod() wydaje się być bezpieczne dla wątków.

Jedynym wyjątkiem jest oczywiście, jeśli jedna z metod wywoływanych za pomocą parametru Obiekt o jako parametr, przechowuje instancję obiektu o w sposób umożliwiający dostęp do niej z innych wątków.

0

Traktuj to w ten sposób.

Jeśli twoje wątki nie mają wspólnych zasobów, nie można mieć problemów z współbieżnością. O ile wiemy z podanych informacji, jedyną rzeczą, którą można udostępnić tutaj, jest someObject. Jeśli jest bezpieczny dla samej wątku lub kopiowany dla każdego wątku, to twój kod jest ogólnie bezpieczny dla wątków, chyba że istnieją inne zasoby udostępnione.

Powiązane problemy