Posted on 2013-10-13 23:17
云云 阅读(459)
评论(0) 编辑 收藏
public synchronized void methodA(int a, int b);
public synchronized void methodB(int a){
methodA(a, 0);
}
这样的代码是成立的,一个线程对同一个对象的锁可以反复获取。这种同步锁称为可重入的锁。
加在非static方法上的synchronized方法是和synchronized(this)块等价的,均为对象锁,即对this加锁。
获得当前对象锁的线程,可以继续获得当前对象锁,JVM负责跟踪对象被加锁的次数。线程运行B方法,此时如果this锁可以用,线程获得该锁,线程给对象加锁,计数器变成1,然后B方法调用A方法,由于是对同一个对象同一个线程,线程可以继续获得锁,计数器变为2,表示this被加锁2次。A方法完毕后,线程释放锁,计数器变为1,此时对象锁对其他线程依然是不可获得的。B方法完毕后,线程继续释放锁,此时计数器变为0,表示锁被完全释放,其他线程可以获得对象锁。
public synchronized void methodA(int a, int b){
}
public synchronized void methodB(int a, int b){
}
以上两方法在同一实例对象上是互斥的,synchronized 加在方法上 即对this加锁,因此在同一实例对象上 两方法是互斥的。