synchronized(this)
синхронизируется на экземпляре объекта.
synchronized(SomeClass.class)
использует экземпляр объекта Class, который представляет SomeClass, который является глобальным для всех экземпляров в одном и том же загрузчике классов.
Таким образом, это разные конструкции с разной семантикой.
Использование только synchronized
или в качестве модификатора метода также синхронизирует семафор экземпляра, который обычно используется для предотвращения конфликта между несколькими потоками, обращающимися к этому экземпляру в качестве общего ресурса (то есть списка).
Поток, на который вы ссылаетесь, утверждает, что лучше использовать закрытый экземпляр, так как синхронизация непосредственно с вашим экземпляром объекта может быть опасной. Для этого вы бы использовали:
class MySharedResourceClass {
private SomeClass lock = new SomeClass();
public doSomething() {
synchronized (lock) {
// Do something here
}
}
}