同步方法调用另一个同步方法,锁机制问题

public synchronized void methodA(int a, int b);

public synchronized void methodB(int a){
methodA(a, 0);
}
B方法可以执行吧……就是说B方法获得锁之后,调用的A方法也可以获得该锁?

 
 
加在非static方法上的synchronized方法是和synchronized(this)块等价的,均为对象锁,即对this加锁。
获得当前对象锁的线程,可以继续获得当前对象锁,JVM负责跟踪对象被加锁的次数。线程运行B方法,此时如果this锁可以用,线程获得该锁,线程给对象加锁,计数器变成1,然后B方法调用A方法,由于是对同一个对象同一个线程,线程可以继续获得锁,计数器变为2,表示this被加锁2次。A方法完毕后,线程释放锁,计数器变为1,此时对象锁对其他线程依然是不可获得的。B方法完毕后,线程继续释放锁,此时计数器变为0,表示锁被完全释放,其他线程可以获得对象锁。
 
要明白两个问题,1.锁的对象是谁,2.谁持有了锁。
假设方法A和B是在同一个类Test中的两个方法。

Test t=new Test(); 
t.methodB();
 
可以,一个线程对同一个对象的锁可以反复获取。这种同步锁称为可重入的锁。
原文地址:https://www.cnblogs.com/ganchuanpu/p/7797263.html