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