środa, października 07, 2009

Czemu wait() i notify()/notifyAll() w ogóle działają?

W nawiązaniu do wpisu o wait() i 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 :-)