posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
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加锁,因此在同一实例对象上 两方法是互斥的。



只有注册用户登录后才能发表评论。


网站导航: