扩展类同步方法锁定

5
假设这段代码:
class A
{
    public synchronized void methodA()
    {
        // ...
    }
}

class B extends A
{
    @Override
    public synchronized void methodA()
    {
        // ...
        super.methodA();
    }
}

如果任何线程想要通过 super.methodA() 访问类 B 的 methodA 函数和父类 A 的 methodA 函数,它应该获取哪个锁?

2个回答

3

当您调用 B b = new B(); b.methodA(); 时,当前线程将在b上获得锁定,进入B.methodA并调用A.methodA。两个方法共享同一个对象,当进入A.methodA时,线程将重新进入它所拥有的相同锁定。


2

synchronized方法相当于将其主体包装在synchronized(this)块中的方法。因此,这个:

public synchronized void methodA()
{
    // ...
}

等同于:

public void methodA()
{
    synchronized(this) {
        // ...
    }
}

现在,您可以轻松地看到methodA的两个实现都锁定在同一个对象上,即this对象。也就是说,如果一个线程在超类synchronized方法中,它也会防止其他线程进入任何子类synchronized方法(反之亦然)。
由于synchronized锁是可重入的,成功进入B.methodA意味着您也可以立即进入super.methodA(因为您已经拥有锁)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接