Подтвердить что ты не робот

Каково использование статического синхронизированного метода в java?

У меня есть один вопрос на мой взгляд, я прочитал статический синхронизированный метод, заблокированный в объекте класса и синхронизированный метод блокирует текущий экземпляр объекта. Итак, значение заблокированного на объект класса?

Кто-нибудь может помочь мне по этой теме?

4b9b3361

Ответ 1

В общем случае методы synchronized используются для защиты доступа к ресурсам, к которым обращаются одновременно. Когда ресурс, к которому обращаются одновременно, принадлежит каждому экземпляру вашего класса, вы используете метод экземпляра synchronized; когда ресурс принадлежит всем экземплярам (т.е. когда он находится в переменной static), вы используете метод synchronized static для доступа к нему.

Например, вы можете создать метод static factory, который хранит "реестр" всех объектов, которые он создал. Естественным местом для такого реестра будет коллекция static. Если ваш factory используется из нескольких потоков, вам необходимо сделать метод factory synchronized (или иметь блок synchronized внутри метода) для защиты доступа к общей коллекции static.

Обратите внимание, что использование synchronized без определенного объекта блокировки обычно не является самым безопасным выбором при создании библиотеки, которая будет использоваться в коде, написанном другими. Это связано с тем, что вредоносный код может синхронизировать ваш объект или класс, чтобы блокировать выполнение ваших собственных методов. Чтобы защитить ваш код от этого, создайте частный "блокирующий" объект, экземпляр или статический и вместо этого синхронизируйте с этим объектом.

Ответ 2

Во время выполнения каждый загруженный класс имеет экземпляр объекта Class. Это объект, который используется в качестве объекта общей блокировки static synchronized методами. (Любой синхронизированный метод или блок должен блокироваться на некотором общем объекте.)

При желании вы также можете синхронизировать этот объект вручную (статическим методом или нет). Эти три метода ведут себя одинаково, пропуская одновременно только один поток во внутренний блок:

class Foo {
    static synchronized void methodA() {
        // ...
    }

    static void methodB() {
        synchronized (Foo.class) {
            // ...
        }
    }

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}

Назначение static synchronized методов - это когда вы хотите, чтобы только один поток одновременно мог использовать какое-либо изменяемое состояние, хранящееся в static переменных класса.

В настоящее время Java имеет более мощные функции параллелизма, в java.util.concurrent и его подпакетах, но основные конструкции Java 1.0, такие как synchronized методы, все еще допустимы и пригодны для использования.

Ответ 3

Проще говоря, static synchronized метод блокирует класс вместо объекта и блокирует класс, потому что ключевое слово static означает "класс вместо экземпляра".

Ключевое слово synchronized означает, что только один поток может получить доступ к методу одновременно.
А static synchronized означают:

Только один поток может получить доступ к классу одновременно.

Ответ 4

статические методы могут быть синхронизированы. Но у вас есть один замок на класс. когда класс java загружен coresponding, есть объект класса java.lang.class. Эта блокировка объекта необходима для синхронизированных методов .static. Поэтому, когда у вас есть статическое поле, доступ к которому должен быть разрешен нескольким потокам одновременно, вы можете установить эти поля закрытыми и создать общедоступные статические синхронизированные установщики или получатели для доступа к этим полям.

Ответ 5

Предположим, что в классе есть несколько статических синхронизированных методов (m1, m2, m3, m4), и предположим, что один поток обращается к m1, тогда никакой другой поток в то же время не может получить доступ к любым другим статическим синхронизированным методам.