Документация Java гласит:
Невозможно чередовать два вызова синхронизированных методов для одного и того же объекта.
Что это значит для статического метода? Поскольку статический метод не имеет связанного объекта, будет ли синхронизированное ключевое слово блокироваться на классе, а не на объекте?
this
это блокировка, полученная при использовании методов экземпляра, пожалуйста, исправьте это, Оскар.Просто чтобы добавить немного подробностей к ответу Оскара (приятно лаконично!), Соответствующий раздел в спецификации языка Java - 8.4.3.6, «синхронизированные методы» :
источник
Вы должны быть осторожны (некоторые ловушки обычно попадают в эту ловушку): нет никакой связи между синхронизированными статическими методами и синхронизированными нестатическими методами, то есть:
Основной:
Тема 1:
Тема 2:
f () и g () не синхронизированы друг с другом и, таким образом, могут выполняться полностью одновременно.
источник
synchronized (MyClass.class) {...}
.Если вы не реализуете g () следующим образом:
Я нахожу этот шаблон полезным также, когда я хочу реализовать взаимное исключение между различными экземплярами объекта (например, это необходимо при доступе к внешнему ресурсу).
источник
getClass()
возвращает тип времени выполнения ; если вы создадите подкласс класса, то родительский класс и дочерний класс будут синхронизироваться при разных блокировках.synchronized(MyClass.class)
это путь, если вам нужно убедиться, что все экземпляры используют одну и ту же блокировку.Взгляните на страницу документации оракула о внутренних замках и синхронизации
источник
Статический метод также имеет связанный объект. Он принадлежит файлу Class.class в наборе инструментов JDK. Когда файл .class загружается в оперативную память, Class.class создает его экземпляр, называемый объектом шаблона.
Например: - когда вы пытаетесь создать объект из существующего класса клиента, как
Загрузка Customer.class в оперативную память. В этот момент Class.class в JDK toolkit создает объект с именем Template и загружает этот Customer.class в этот объект шаблона. Статические члены этого Customer.class становятся атрибутами и методами в этом объекте шаблона.
Таким образом, статический метод или атрибут также имеет объект
источник
Приведенные ниже примеры дают больше ясности между блокировкой классов и объектов, надеюсь, что приведенный ниже пример поможет и другим :)
Например, у нас есть следующие методы: один получить класс, а другой получить объект блокировки:
Итак, теперь у нас могут быть следующие сценарии:
Когда потоки, использующие один и тот же объект, пытаются получить доступ к методу
objLock
OR вstaticLock
одно и то же время (т.е. оба потока пытаются получить доступ к одному и тому же методу)Когда потоки, использующие один и тот же объект, пытаются получить доступ
staticLock
иobjLock
методы в одно и то же время (пытается получить доступ к различным методам)Когда потоки, использующие другой объект, пытаются получить доступ к
staticLock
методуКогда потоки, использующие другой объект, пытаются получить доступ к
objLock
методуисточник
Для тех, кто не знаком, статический синхронизированный метод заблокирован на объекте класса, например для строкового класса, его String.class, в то время как синхронизированный метод экземпляра блокирует текущий экземпляр объекта, обозначенный ключевым словом «this» в Java. Поскольку оба эти объекта различны, они имеют разную блокировку, поэтому, пока один поток выполняет статический синхронизированный метод, другому потоку в java не нужно ждать возврата этого потока, вместо этого он получит отдельную блокировку, обозначенную байтом .class, и войдет в статический синхронизированный метод.
источник