[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-na-kakom-obekte-proiskhodit-sinkhronizatsiya-pri-vyzove-static-synchronized-metoda":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},248,"na-kakom-obekte-proiskhodit-sinkhronizatsiya-pri-vyzove-static-synchronized-metoda",8,"mnogopotochnost","Многопоточность","🔀","На каком объекте происходит синхронизация при вызове static synchronized метода?","\u003C!-- grade: 4\u002F5 — ответ корректный с примером, но можно дополнить нюансами -->\n\nПри вызове `static synchronized` метода синхронизация происходит на объекте **`Class\u003C?>`** данного класса. Каждый загруженный класс в JVM имеет ровно один объект `Class\u003C?>`, и именно он выступает монитором для всех статических синхронизированных методов этого класса.\n\n### Эквивалентные конструкции\n\nСледующий `static synchronized` метод:\n\n```java\npublic class SomeClass {\n    public static synchronized void someMethod() {\n        \u002F\u002F код\n    }\n}\n```\n\nполностью эквивалентен:\n\n```java\npublic class SomeClass {\n    public static void someMethod() {\n        synchronized (SomeClass.class) {\n            \u002F\u002F код\n        }\n    }\n}\n```\n\n### Ключевые следствия\n\n| Аспект | Описание |\n|---|---|\n| Один монитор на класс | Все `static synchronized` методы одного класса разделяют один монитор -- `SomeClass.class` |\n| Независимость от экземпляров | Статическая и нестатическая синхронизация используют **разные** мониторы: `Class\u003C?>` vs `this` |\n| Параллельный доступ | `static synchronized` метод и обычный `synchronized` метод одного класса **могут** выполняться параллельно, т.к. захватывают разные мониторы |\n| Создание экземпляров | Оператор `new` не требует захвата монитора, поэтому новые экземпляры можно создавать даже когда `static synchronized` метод выполняется |\n\n\u003Cdetails>\n\u003Csummary>Пример: независимость статического и нестатического мониторов\u003C\u002Fsummary>\n\n```java\npublic class MonitorDemo {\n    \u002F\u002F Монитор: MonitorDemo.class\n    public static synchronized void staticMethod() {\n        System.out.println(\"static: \" + Thread.currentThread().getName());\n        try { Thread.sleep(2000); } catch (InterruptedException e) { }\n    }\n\n    \u002F\u002F Монитор: this (конкретный экземпляр)\n    public synchronized void instanceMethod() {\n        System.out.println(\"instance: \" + Thread.currentThread().getName());\n        try { Thread.sleep(2000); } catch (InterruptedException e) { }\n    }\n\n    public static void main(String[] args) {\n        MonitorDemo obj = new MonitorDemo();\n        \u002F\u002F Эти два вызова выполнятся ПАРАЛЛЕЛЬНО -- разные мониторы\n        new Thread(MonitorDemo::staticMethod).start();\n        new Thread(obj::instanceMethod).start();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **Аналогия из жизни.** Представьте офис компании: `static synchronized` -- это замок на входной двери всего здания (один на всю компанию), а обычный `synchronized` -- это замок на двери конкретного кабинета (у каждого сотрудника свой). Можно запереть кабинет, не блокируя вход в здание, и наоборот.\n\n> **На собеседовании.** Часто за этим вопросом следует подвопрос: «Могут ли `static synchronized` метод и обычный `synchronized` метод одного класса выполняться одновременно?» Ответ -- да, могут, потому что используются разные мониторы. Это важно для понимания архитектуры блокировок.","","middle",[15,16,17,18,19],"synchronized","монитор","static","Class","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Синхронизация static synchronized метода в Java — на каком объекте — Gymterview","Статический synchronized метод синхронизируется на объекте Class, а не на this. Объект класса существует в единственном экземпляре и выступает монитором.","Static synchronized метод — какой объект выступает монитором?","У статического метода нет this. Монитором выступает объект SomeClass.class — единственный экземпляр Class для данного класса.",[28,29,30,31],"static synchronized Java","на чём синхронизируется статический метод","монитор статического метода","synchronized static разница","У синхронизированного статического метода нет доступа к this. Монитором выступает объект Class, который существует в единственном экземпляре. Конструкция public static synchronized void someMethod() эквивалентна synchronized(SomeClass.class) { ... }.",true]