扩展类同步方法锁定

时间:2014-01-28 07:22:10

标签: java multithreading concurrency

假设此代码

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

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

任何线程如果要通过super.methodA()访问B类的methodA函数和超类A的methodA,应该获取什么锁?

2 个答案:

答案 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(因为您已经锁定)。