Хотя этот код не будет компилироваться, как уже упоминалось, давайте рассмотрим случай, когда method2 не является статическим. Вызов из method1 в method2, а затем в method3 является хорошим примером повторяющейся синхронизации. Когда поток инициируется, он создает новый стек с помощью run ( ) в нижней части стека. Так как вызов метода1 происходит из run (), он добавляется в стек над run (), а затем идет метод2 и метод3 в стеке. Кроме того, поскольку блокировка объекта выполняется методом method2 в стеке, блокировка поддерживается для всех синхронизированных API-интерфейсов, вызываемых. Снятие блокировки инициируется путем развертывания самого верхнего метода (в данном случае method3) в стеке до фактического API-интерфейса. Достигнута синхронизация вызовов.

я есть два метода в классе Java, которые оба имеют блок кода, который синхронизируется с использованием одного и того же объекта. Я понимаю, что в схеме синхронизации JAVA блокировки, полученные потоком, являются реентерабельными. Могу ли я с уверенностью сказать, что приведенный ниже фрагмент кода не вызовет проблем во всех случаях?

public class Someclass  
{  
  private static final Object LCK_OBJ = new Object();  
  //.....

  publc void method1()  
  {  
    //some code....  
    synchronized(LCK_OBJ)  
    {  
        //some sychronized code.  
        method2(..);  
    }  
    //some more code....  
  }  

  protected static final void method2(..)  
  {  
      Someclass ref = null;  
      //some code which gets different other references of SomeClass in a loop....  
      ref.method3(..);  
  }  

  publc void method3()  
  {  
    //some code....  
    synchronized(LCK_OBJ)  
    {  
      //some sychronized code.  
    }  
    //some more code....  
  }  

}//end of class    

Ответы на вопрос(4)

Ваш ответ на вопрос