Jest proste, głupie pytanie, które przeszkadza mi i rodzi kilka argumentów w mojej głowie. Chcę odrzucić wszystkie wątpliwości dotyczące poniższych pytań.
class Clstest{
public static String testStaticMethod(String inFileStr) {
// section 0
// section 1
// do something with inFileStr
// section 2
// section 3
return inFileStr;
}
}
Załóżmy, że każdy z pięciu wątków wykonuje wywołanie Clstest.testStaticMethod("arg-n")
w tym samym czasie.
Wątek 1 wywołuje Clstest.testStaticMethod("arg-1")
.
Gdy wątek 1 znajduje się w sekcji 1, wywołuje wątek 2 Clstest.testStaticMethod("arg-2")
.
Co się stanie z wątkiem 1? Czy przejdzie w stan uśpienia?
Kiedy wątek 1 dostanie szansę, czy wznowi wykonywanie od sekcji 1, w której został wstrzymany?
Jak to się dzieje, gdy we wszystkich pięciu wątkach jest jeden Clstest.testStaticMethod
i Clstest.testStaticMethod
to samo ?
Czy istnieje możliwość zamiany inFileStr
wysłanych wieloma wątkami?
java
multithreading
static-methods
namalfernandolk
źródło
źródło
Odpowiedzi:
Odpowiedź Hansa Passanta jest dobra. Ale pomyślałem, że spróbuję wyjaśnić na nieco prostszym poziomie każdemu, kto zetknie się z tym i jest nowicjuszem w Javie. Tutaj idzie..
Pamięć w Javie jest podzielona na dwa rodzaje - stertę i stosy. Sterta to miejsce, w którym żyją wszystkie obiekty, a stosy są tam, gdzie nici wykonują swoją pracę. Każdy wątek ma swój własny stos i nie ma dostępu do innych stosów. Każdy wątek ma również wskaźnik do kodu, który wskazuje na bit kodu, który aktualnie działa.
Gdy wątek rozpoczyna uruchamianie nowej metody, zapisuje argumenty i zmienne lokalne tej metody na swoim własnym stosie. Niektóre z tych wartości mogą wskazywać na obiekty na stercie. Jeśli dwa wątki uruchomią tę samą metodę w tym samym czasie, oba będą miały swoje wskaźniki kodu wskazujące na tę metodę i będą miały własne kopie argumentów i zmiennych lokalnych na swoich stosach. Będą kolidować ze sobą tylko wtedy, gdy rzeczy na ich stosach będą wskazywać te same obiekty na stercie. W takim przypadku mogą się zdarzyć różne rzeczy. Ale jak wskazuje Hans, ciągi znaków są niezmienne (nie można ich zmienić), więc jesteśmy bezpieczni, jeśli jest to jedyny obiekt, który jest „udostępniany”.
Tak wiele wątków może działać tą samą metodą. Mogą nie działać w tym samym czasie - zależy to od liczby rdzeni na komputerze, ponieważ JVM odwzorowuje wątki Java na wątki systemu operacyjnego, które są zaplanowane na wątki sprzętowe. W związku z tym masz niewielką kontrolę nad sposobem przeplatania się tych wątków bez stosowania skomplikowanych mechanizmów synchronizacji .
Zauważ, że spanie jest czymś, co robi sobie nić.
źródło
Nie, uruchomienie wątku nie wpływa na inne wątki, o ile nie są one celowo synchronizowane ze sobą. Jeśli masz więcej niż jeden rdzeń procesora, tak jak wszystkie najnowsze maszyny, te wątki prawdopodobnie będą wykonywane dokładnie w tym samym czasie. Staje się to nieco mniej prawdopodobne, gdy uruchomisz 5 wątków, ponieważ twój komputer może nie mieć wystarczającej liczby rdzeni. System operacyjny jest zmuszony wybierać między nimi, dając każdemu trochę czasu na uruchomienie. Zadanie harmonogramu wątków. Wątek nie będzie wtedy w stanie „uśpienia”, jest po prostu wstrzymywany i czeka, aż program planujący wątki da mu szansę na uruchomienie. Zostanie wznowiony w miejscu, w którym został przerwany przez harmonogram.
Nie ma takiej możliwości, wątki mają swój własny stos, więc każdy argument metody i zmienna lokalna będą unikalne dla każdego wątku. Użycie łańcucha gwarantuje ponadto, że te wątki nie mogą ze sobą kolidować, ponieważ łańcuchy są niezmienne.
Nie ma takiej gwarancji, jeśli argument jest odwołaniem do innego rodzaju zmiennego obiektu. Lub jeśli sama metoda używa zmiennych statycznych lub odwołań do obiektów na stercie. Synchronizacja jest wymagana, gdy wątek modyfikuje obiekt, a inny wątek go odczytuje. Blokady słów kluczowych w języku C # jest droga boilerplate wdrożyć taki wymaganej synchronizacji. Fakt, że metoda jest statyczna , nie oznacza, że taka synchronizacja nigdy nie jest wymagana. Jest tylko mniej prawdopodobne, ponieważ nie musisz martwić się o wątki uzyskujące dostęp do tego samego obiektu (udostępniając go ).
źródło