Хотя этот код не будет компилироваться, как уже упоминалось, давайте рассмотрим случай, когда 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