Каждый класс, загруженный в Java, имеет соответствующий экземпляр java.lang.Class , представляющий этот класс, это тот экземпляр java.lang.Class , чья блокировка используется для защиты статическогометоды класса.Где instanceMethod использует объектную блокировку. Пожалуйста, смотрите комментарии, размещенные над методами ниже
class Test {
// lock will be on corresponding instance of **java.lang.Class**
//representing Test class
public static synchronized void staticMethod(){
}
// lock will be on corresponding Test Class object
public synchronized void instanceMethod(){
}
}
Относительно вашего вопроса:
1. Если я блокирую метод staticMethod с помощью блокировки экземпляра объекта, то любой поток владеетКласс блокировки может получить доступ к методу одновременно?
Во-первых, вы не должны блокировать статический метод с помощью блокировки объекта, но все же, если вы хотите заблокировать его с помощью блокировки объекта, фрагмент кода должен быть таким, как показано ниже, и в этом случае любой поток владеетБлокировка класса может получить доступ к методу одновременно, только если блокировка объекта не была взята никаким другим потоком.
public static void staticMethod(Test test){
synchronized(test)
{ }
}
2. Если я блокирую метод instanceMethod, используя блокировку экземпляра класса, тогда любой поток, владеющий блокировкой объекта, может получить доступ к объекту.метод одновременно? Зависит от того, установил ли какой-либо поток блокировку над экземпляром класса, тогда поток владеет объектной блокировкой, но не может получить к ней доступ.