Чтобы понять это, самый простой способ - сравнить, как блокировка работает против метода экземпляра и статического метода. Допустим, у вас есть класс Test.java, который имеет два метода.
public class Test{
public synchronized void instanceMethod(){
}
public synchronized static void staticMethod(){
}
}
Между тем существуют два экземпляра класса Test, testA и testB. А также есть два потока tA и tB, пытающихся параллельно обращаться к классу Test.
замок на instanceMethod: Когда TĀ получает блокировку на instanceMethod из Testa, Tb не может получить доступ к тому же методу в Testa, однако Tb все еще свободно ссылаться на instanceMethod в testB. Поскольку синхронизация против instanceMethod является уровень экземпляра блокировки
замок на STATICMETHOD: Однако, когда Tā получает блокировку на STATICMETHOD, замок не имеет ничего общего с Testa или testB, так как синхронизация на статический метод является блокировка уровня класса.Это означает, Tb не может получить доступ к STATICMETHOD на всех, пока TĀ не уберет блокировку
Поскольку статические методы доступны для всех экземпляров, он блокирует все экземпляры. – duffymo
Хотя статические методы доступны экземплярам, к ним не следует обращаться через экземпляры. Они должны быть доступны только статически. Так что автор говорит, что это неправильно. – sotn
@duffymo Нет, он не блокирует * любые * экземпляры. «synchronized (this)» будет действовать во время этой блокировки. – EJP