Załóżmy, że mamy maszynę wieloprocesorową i aplikację wielowątkową. Jeśli dwa wątki mają dostęp do zsynchronizowanej metody i zostaną wykonane w tym samym czasie, który wątek otrzyma blokadę? lub co się stanie?Który wątek otrzyma blokadę?
Dzięki
Załóżmy, że mamy maszynę wieloprocesorową i aplikację wielowątkową. Jeśli dwa wątki mają dostęp do zsynchronizowanej metody i zostaną wykonane w tym samym czasie, który wątek otrzyma blokadę? lub co się stanie?Który wątek otrzyma blokadę?
Dzięki
Chodzi o to, że nie ma czegoś takiego jak "w tym samym czasie". Jeden z nich dostanie zamek, ale nie masz możliwości dowiedzenia się, który.
Nie ma czegoś takiego "w tym samym czasie", ponieważ, mówiąc prościej, zamek jest coś, co, który wybiera i wykonuje wątki tylko jeden naraz.
Jest to oczywiście realizowane w czystym systemie monoprocesorowym, który może wykonywać jedną instrukcję naraz. W systemach wieloprocesorowych zwykle istnieje pewne urządzenie sprzętowe, które "blokuje" procesory, aby zapobiec ich jednoczesnemu uruchomieniu.
Zachowanie będzie niedeterministyczne (czyli albo gwint może otrzymać blokadę) i może różnić się od wykonania egzekucji. Dzieje się tak dlatego, że zależy to od konkretnej implementacji maszyny JVM i konkretnego harmonogramowania wątków.
Zgodnie z tym artykułem specyfikacja JVM stawia żadnych ograniczeń na sprawiedliwości:
Uczciwość
Model pamięci Java nie określa żadnego wymogu rzetelności na nici lub poboru wielowątkowości. Wątek może odmówić poddania procesora innemu wątkowi i wepchnięciu systemu w zakleszczenie. Zasady uczciwości wobec innych wątków są definiowane przez poszczególne implementacje JVM.
To znaczy, chyba że starannie zsynchronizujesz program, jeden wątek może teoretycznie zostać zagłodzony przez program planujący.
Zgaduję, że VM będzie musiała rzucić monetą. –
Trochę związane z http://stackoverflow.com/questions/3940164/java-waiting-on-synchronized-block-who-goes-first – Thilo
Czy to oznacza, że VM może zagłodzić jeden wątek, jeśli oba wątki próbują uzyskać zablokować w pętli? –