Блокировка Java на статический и нестатический метод? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть класс ниже, и несколько потоков хотят получить доступ к методам.Пожалуйста, уточните следующие пункты.

Если я блокирую метод staticMethod с помощью блокировки экземпляра объекта, то любой поток, имеющий блокировку класса, может получить доступ к методу одновременно?

Если я блокирую метод instanceMethod с помощью блокировки экземпляра класса, тогда любойПоток владеет объектом блокировки может получить доступ к методу одновременно?

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Каждый класс, загруженный в 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, используя блокировку экземпляра класса, тогда любой поток, владеющий блокировкой объекта, может получить доступ к объекту.метод одновременно? Зависит от того, установил ли какой-либо поток блокировку над экземпляром класса, тогда поток владеет объектной блокировкой, но не может получить к ней доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...