Używam visualVM podłączam wielowątkową aplikację Java, wątek ma status 4, a mianowicie działa, śpi, czekaj, monitor. Co oznacza ten stan monitorowania? Jaka jest różnica między czekaniem a monitorem?
Odpowiedzi:
Te stany są takie same, jak wymienione w Thread.State
wyliczeniu. „Czekaj” oznacza, jak mówi dokumentacja:
Wątek jest w stanie oczekiwania z powodu wywołania jednej z następujących metod:
- Object.wait bez limitu czasu
- Thread.join bez limitu czasu
- LockSupport.park
„Monitor” to BLOCKED
stan, w którym wątek oczekuje na uzyskanie blokady obiektu (ponieważ próbuje wejść do synchronized
bloku lub metody, podczas gdy inny wątek już posiada skojarzoną blokadę).
sleeping
i waiting
pokazanymi na zrzucie ekranu ?!
Monitor oznacza, że wątek oczekuje na osiągnięcie blokady obiektu. Na przykład, gdy jeden wątek uruchamia metodę zsynchronizowaną, a inny próbuje wywołać ją na tym samym obiekcie, nie będzie mógł tego zrobić, dopóki pierwsze wywołanie metody nie zostanie zakończone. Dzieje się tak, ponieważ pierwszy wątek ma monitor lub blokadę tego obiektu, więc drugi musi poczekać, aż zostanie zwolniony.
Z samouczków Oracle Threading :
„Synchronizacja jest zbudowana wokół jednostki wewnętrznej znanej jako blokada wewnętrzna lub blokada monitora. (Specyfikacja interfejsu API często odnosi się do tej jednostki po prostu jako„ monitor ”). Blokady wewnętrzne odgrywają rolę w obu aspektach synchronizacji: wymuszanie wyłącznego dostępu do stan obiektu i ustanowienie relacji wydarzyło się przed, które są niezbędne dla widoczności ”.