Блокировка реализации объекта класса Class для синхронизации

Я просматривал эту ссылку . Согласно этому :

Блокировки классов на самом деле реализуются как блокировки объектов. Когда JVM загружает файл класса, он создает экземпляр класса java.lang.Class. Когда вы блокируете класс, вы фактически блокируете объект Class этого класса.

Но согласно спецификации java все объекты одного типа (класса) в куче совместно используют один объект класса. Так как же это может быть верно для многопоточного синхронизированного доступа к объектам?


person mohit    schedule 01.08.2013    source источник


Ответы (3)


Блокировка класса

synchronized (String.class) {...}

Блокировка объекта

//doesn't matter what the lock object is as long as it's not null
private final Object lock = new Object(); 
...
synchronized (lock) {...} // will throw NPE if lock is null

Обе они считаются блокировками object, поскольку String.class возвращает экземпляр Class<String>.

В блокировке класса поток получает монитор экземпляра Class<String>. При блокировке объекта поток получает монитор экземпляра String.

person Sotirios Delimanolis    schedule 01.08.2013
comment
@assylias Ты прав. Я хотел показать, что предмет не имеет значения, но не хотел путать со словом Object. - person Sotirios Delimanolis; 01.08.2013

Но согласно спецификации java все объекты одного типа (класса) в куче совместно используют один объект класса. Так как же это может быть верно для многопоточного синхронизированного доступа к объектам?

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

person Ravi K Thapliyal    schedule 01.08.2013

Но согласно спецификации java все объекты одного типа (класса) в куче совместно используют один объект класса. Так как же это может быть верно для многопоточного синхронизированного доступа к объектам?

Блокировки на уровне класса имеют больше смысла в статических методах. Если вы используете ключевое слово synchronized в статическом методе, объект, монитор которого используется для блокировки, является объектом класса, то есть тем, который представлен литералом Class.class.

person Juned Ahsan    schedule 01.08.2013