Если у класса A есть общедоступный статический метод, который помечен ключевым словом synchronized, то есть ли возможность иметь блокировку на уровне класса?

Когда в таком классе есть блокировка, можем ли мы создать экземпляр объекта этого класса, или это не имеет ничего общего с созданием экземпляра?

1
MduSenthil 28 Авг 2011 в 21:43

3 ответа

Лучший ответ

Если у класса A есть общедоступный статический метод, помеченный ключевым словом synchronized, то есть ли возможность иметь блокировку на уровне класса?

Да, на классе A будет блокировка на уровне класса.

Когда в таком классе есть блокировка, можем ли мы создать экземпляр объекта этого класса, или это не имеет ничего общего с созданием экземпляра?

Блокировка статического метода влияет только на другие синхронизированные статические методы. Вы все еще можете создать новый экземпляр этого класса.

4
Amir Raminfar 28 Авг 2011 в 17:59

Да, блокировка будет сохранена для объекта Class.

Цитируется из Блокировки в синхронизированных методах

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

3
rajasaur 28 Авг 2011 в 17:47

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

2
JB Nizet 28 Авг 2011 в 17:48