同步方法调用另一个同步方法,锁机制问题
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();
可以,一个线程对同一个对象的锁可以反复获取。这种同步锁称为可重入的锁。
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();
可以,一个线程对同一个对象的锁可以反复获取。这种同步锁称为可重入的锁。
相关文章推荐
- java synchronized同步方法调用另一个同步方法,锁机制问题
- Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题
- 今天遇到了"从不同步的代码块中调用了对象同步方法"问题
- backbone中一个view调用另一个view的方法时报is not a constructor的问题
- Spring service本类中方法调用另一个方法事务不生效问题
- Spring-service本类中方法调用另一个方法事务不生效问题
- 关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题
- 从一个窗体类调用另一个窗体类中方法,出现句柄错误问题
- Spring service本类中方法调用另一个方法事务不生效问题
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题【转】
- 有空帮我看一下,多线程(问题:从不同步的代码块中调用了对象同步方法)
- Spring service本类中方法调用另一个方法事务不生效问题
- 小问题之动态调用另一个程序集里的方法
- 同步方法调用另一个同步方法的锁
- WCF方法“异步调用”的“同步问题”
- WCF调用同步方法超时问题
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
- 使用dwr同步调用导致无法获取js方法的返回结果问题的解决办法
- Spring service本类中方法调用另一个方法事务不生效问题
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题