您的位置:首页 > 其它

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

2017-11-07 08:47 309 查看
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();

可以,一个线程对同一个对象的锁可以反复获取。这种同步锁称为可重入的锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: