Синхронизированные статические методы Java: блокировка объекта или класса



учебники Java говорят: "Невозможно, чтобы два вызова синхронизированных методов на одном объекте чередовались."



что это значит для static method? Поскольку статический метод не имеет связанного объекта, будет ли синхронизированное ключевое слово блокировать класс, а не объект?

827   8  

8 ответов:

поскольку статический метод не имеет связанного объекта,будет ли синхронизированное ключевое слово блокировать класс, а не объект?

да. :)

просто чтобы добавить немного деталей к Оскару (приятно лаконично!) ответ, соответствующий раздел спецификации языка Java является 8.4.3.6, 'synchronized методы':

синхронизированный метод получает монитор (§17.1) перед его выполнением. Для метода класса (статического) используется монитор, связанный с объектом класса для класса метода. Для метода экземпляра монитор, связанный с этим (объект, для которого был вызван метод) является используемый.

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

class A {
    static synchronized f() {...}
    synchronized g() {...}
}

главное:

A a = new A();

резьбы 1:

A.f();

резьба 2:

a.g();

f() и g () не синхронизированы друг с другом и, таким образом, могут выполняться полностью одновременно.

Если вы не реализуете g () следующим образом:

g() {
    synchronized(getClass()) {
        ...
    }
}

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

посмотрите на страницу документации oracle на встроенные блокировки и синхронизация

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

ниже примеры дает больше ясности между классом и объектом блокировки, надеюсь, что ниже пример поможет другим, а также :)

например, у нас есть ниже методы один получить класс и другие получить объект блокировки:

public class MultiThread {

    public static synchronized void staticLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public synchronized void objLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

Итак, теперь мы можем иметь следующие сценарии :

  1. при использовании потоков тот же объект пытается получить доступ к objLockилиstaticLock метод в то же время (т. е. оба потока пытаются получить доступ тот же метод)

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  2. при использовании потоков тот же объект пытается получить доступ к staticLock и objLock методы в то же время (пытается получить доступ к различным методам)

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    
  3. при использовании потоков другой объект пытается получить доступ к staticLock метод

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  4. при использовании потоков другой объект пытается получить доступ к objLock метод

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    

статический метод также имеет связанный с ним объект. Он принадлежит к классу.файл класса в JDK toolkit. Когда.загрузка файла класса в оперативную память, класс.класс создает его экземпляр с именем template object.

например : - при попытке создать объект из существующего класса клиента, как

Customer c = new Customer();

Клиент.загрузка класса в оперативную память. В тот момент класс.класс в JDK toolkit создает объект с именем Template object и загружает этого клиента.класс в этот шаблон объект.Статические члены этого клиента.класс становится атрибутами и методами в этом объекте шаблона.

таким образом, статический метод или атрибут также имеет объект

для тех, кто не знаком со статическим синхронизированным методом, заблокированным на объекте класса, например, для класса string его строка.class while instance synchronized method блокирует текущий экземпляр объекта, обозначенного ключевым словом "this" в Java. Поскольку оба этих объекта различны, они имеют разную блокировку, поэтому, когда один поток выполняет статический синхронизированный метод, другому потоку в java не нужно ждать, пока этот поток вернется, вместо этого он получит отдельный байт, обозначенный блокировкой .литерал класса и войдите в статический синхронизированный метод.

Comments

    Ничего не найдено.