notify()
/notifyAll()
. Nikt nie zapytał dlaczego to w ogóle działa ;-)Skoro
wait()
i notify()
muszą być w kodzie, który jest synchronizowany na obiekcie w którego kontekście wołane są te metody to jak to może działać? Przecież synchronizacja działa mniej więcej tak, że gdy jeden wątek jest w sekcji synchronizowanej na danym obiekcie to inny zostanie zablokowany w momencie gdy spróbuje wejść do takiej sekcji... Jak więc możliwe jest by jeden wątek wszedł do tej sekcji i zawołał wait()
/wait(int)
, a następnie inny wątek znów wszedł do sekcji synchronizowanej i zawołał notify()
/notifyAll()
?Działa to ponieważ w momencie wywołania
wait()
obiekt jest przesuwany ze stanu w którym jest aktywny do stanu w którym śpi. Dopiero notify()
lub coś co spowoduje wyrzucenie z wait()
wyjątku InterruptedException
może przywrócić go do wątków aktywnych [może, ale nie musi w przypadku notify()
, która wybudzi dowolny [ale tylko jeden] z wątków które wiszą na danym monitorze, notifyAll()
wybudzi je wszystkie, ale to JVM zdecyduje czy, kiedy i który wątek zostanie wykonany w jakimś momencie].Mam nadzieję, że to trochę rozjaśni mroki wątków ;-)
Podobne postybeta
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Google Play Services dobre jest :-)
Modale nie takie dobre dla Androida ;-)
Potfór ;-) czyli generator z yield w Java'ie
Chrome2ChromeV2 na GitHub :-)
Brak komentarzy:
Prześlij komentarz