[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-kak-proverit-uderzhivaet-li-potok-monitor-opredelyonnogo-resursa":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},247,"kak-proverit-uderzhivaet-li-potok-monitor-opredelyonnogo-resursa",8,"mnogopotochnost","Многопоточность","🔀","Как проверить, удерживает ли поток монитор определённого ресурса?","\u003C!-- grade: 3\u002F5 — ответ слишком краткий, не раскрыт контекст и ограничения метода -->\n\nДля проверки того, удерживает ли **текущий** поток монитор определённого объекта, используется статический метод `Thread.holdsLock(Object obj)`. Метод возвращает `true`, если текущий поток владеет монитором переданного объекта, и `false` в противном случае.\n\n### Сигнатура\n\n```java\npublic static native boolean holdsLock(Object obj);\n```\n\n### Пример использования\n\n\u003Cdetails>\n\u003Csummary>Пример: проверка владения монитором\u003C\u002Fsummary>\n\n```java\npublic class HoldsLockDemo {\n    private static final Object lock = new Object();\n\n    public static void main(String[] args) {\n        System.out.println(\"До synchronized: \"\n            + Thread.holdsLock(lock)); \u002F\u002F false\n\n        synchronized (lock) {\n            System.out.println(\"Внутри synchronized: \"\n                + Thread.holdsLock(lock)); \u002F\u002F true\n        }\n\n        System.out.println(\"После synchronized: \"\n            + Thread.holdsLock(lock)); \u002F\u002F false\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важные особенности\n\n| Аспект | Описание |\n|---|---|\n| Проверяемый поток | Только **текущий** -- нельзя проверить, удерживает ли монитор другой поток |\n| Аргумент `null` | Выбросит `NullPointerException` |\n| Применение в `assert` | Часто используется в assertions: `assert Thread.holdsLock(lock)` |\n| Влияние на `ReentrantLock` | Метод работает только с intrinsic-мониторами (`synchronized`), но **не** с `java.util.concurrent.locks.Lock` -- для `ReentrantLock` используйте `lock.isHeldByCurrentThread()` |\n\n> **Аналогия из жизни.** Вы держите в руках ключ от комнаты и спрашиваете себя: «Этот ключ у меня?» -- `holdsLock()` отвечает именно на этот вопрос. Но вы не можете таким способом проверить, у кого в руках другой ключ.\n\n> **На собеседовании.** Этот вопрос часто задают вместе с вопросами о `synchronized`. Покажите, что знаете ограничение: `holdsLock()` работает только для intrinsic-мониторов. Для `ReentrantLock` есть отдельный метод `isHeldByCurrentThread()`. Также упомяните, что `holdsLock()` полезен в отладочных assertions.","","middle",[15,16,17,18,19],"holdsLock","синхронизация","monitor","Thread","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Thread.holdsLock() — проверка удержания монитора в Java — Gymterview","Метод Thread.holdsLock(lock) возвращает true, если текущий поток удерживает монитор указанного объекта. Применение для отладки синхронизации.","Как проверить, удерживает ли поток монитор объекта?","Thread.holdsLock(lock) возвращает true, когда текущий поток удерживает монитор у определённого объекта.",[28,29,30,31],"Thread.holdsLock Java","проверка монитора потока","удержание монитора Java","holdsLock пример","Метод Thread.holdsLock(lock) возвращает true, когда текущий поток удерживает монитор у определённого объекта.",true]