假设此代码
class A
{
public synchronized void methodA()
{
// ...
}
}
class B extends A
{
@Override
public synchronized void methodA()
{
// ...
super.methodA();
}
}
任何线程如果要通过super.methodA()
访问B类的methodA函数和超类A的methodA,应该获取什么锁?
答案 0 :(得分:3)
当您致电B b = new B(); b.methodA();
时,当前主题将锁定b
,请输入B.methodA
并致电A.methodA
。两种方法共享同一个对象,当输入A.methodA
时,线程将重新输入它已拥有的相同锁。
答案 1 :(得分:2)
synchronized
方法相当于一个方法,其主体包裹在synchronized(this)
块中。因此,这个:
public synchronized void methodA()
{
// ...
}
与:
相同public void methodA()
{
synchronized(this) {
// ...
}
}
现在,您可以轻松地看到两个methodA
实现都锁定了同一个对象,即this
对象。也就是说,如果一个线程在超类的synchronized
方法中,它还会阻止其他线程进入子类的任何synchronized
方法 (反之亦然)。
由于synchronized
锁是可重入的,因此成功输入B.methodA
意味着您也可以立即输入super.methodA
(因为您已经锁定)。