Я використовую visualVM для підключення багатопотокової програми Java, потік має 4 статуси, а саме працює, сплячий, чекає, монітор. Що означає цей статус моніторингу? Яка різниця між очікуванням та монітором?
Я використовую visualVM для підключення багатопотокової програми Java, потік має 4 статуси, а саме працює, сплячий, чекає, монітор. Що означає цей статус моніторингу? Яка різниця між очікуванням та монітором?
Відповіді:
Ці стани такі самі, як зазначено у Thread.State
переліку. "Чекати" означає, як сказано в документації:
Потік знаходиться в стані очікування через виклик одного з наступних методів:
- Object.wait без тайм-ауту
- Thread.join без тайм-ауту
- LockSupport.park
"Монітор" - це BLOCKED
стан, в якому потік чекає отримання блокування для об'єкта (оскільки він намагається ввести synchronized
блок або метод, тоді як інший потік вже містить відповідний замок).
sleeping
і waiting
показаним на скріншоті ?!
Це не статус "моніторингу" ... Це вказує на те, що нитка знаходиться у Thread.State.BLOCKED
стані. Я бачу, що є ще одна хороша відповідь, я просто вкажу вам на це посилання для більш глибокого пояснення
Монітор означатиме, що потік чекає, щоб досягти блокування об’єкта. Наприклад, коли в одному потоці запущений синхронізований метод, а інший намагається викликати його на тому самому об’єкті, він не зможе, поки не буде завершено перше виклик методу. Це пов’язано з тим, що перший потік має монітор або блокування на цьому об’єкті, тому другий повинен почекати, поки він звільниться.
З підручників Oracle Threading :
"Синхронізація будується навколо внутрішньої сутності, відомої як внутрішній замок або блокування монітора. (Специфікація API часто позначає цю сутність просто як" монітор ".) Внутрішні блокування відіграють певну роль в обох аспектах синхронізації: забезпечуючи ексклюзивний доступ до стан об'єкта та встановлення стосунків, що відбуваються раніше, що є важливими для видимості ".