Да, это будет синхронизировано между всеми экземплярами всех классов, расширяющих BaseClass
(включая сам BaseClass
).Ссылка BaseClass.class
в основном будет единственной ссылкой для всего загрузчика классов.Вы действительно этого хотите?
Обычно , когда требуется синхронизация, статические методы должны синхронизироваться с чем-то статическим, а методы экземпляра должны синхронизироваться с чем-то связанным с экземпляром.Лично мне не нравится синхронизация либо по ссылке this
, либо по ссылке Class
, поскольку обе эти ссылки доступны в другом месте, поэтому другой код может синхронизироваться на том же мониторе, что затрудняет рассуждение о синхронизации.Вместо этого я хотел бы иметь:
public class Foo {
private final Object instanceLock = new Object();
public void doSomething() {
synchronized (instanceLock) {
// Stuff
}
}
}
public class Bar {
private static final Object staticLock = new Object();
public static void doSomething() {
synchronized (staticLock) {
// Stuff
}
}
}
(я обычно просто использую lock
в качестве имени; я только что сделал это более ясным здесь для ясности.)