Java:在超类方法上同步

时间:2012-12-10 17:15:15

标签: java concurrency

abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public void aMethod(){
        //Some actions here
    }
}

public class B extends Basic{
    public void bMethod(){
        //Some actions here
    }
}

Basic a = new A();
Basic b = new B();

a.basicMethod(); // acquires lock
b.basicMethod(); //Same lock?

换句话说 - 锁也与具体的Object或Super class有关吗?

5 个答案:

答案 0 :(得分:5)

不同的锁。 synchronized实例方法在与特定对象实例关联的监视器上同步,因此ab中的每一个都有自己的监视器。

如果你有

abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public synchronized void aMethod(){
        //Some actions here
    }
}

然后调用a.basicMethod()a.aMethod()将锁定同一个监视器。

答案 1 :(得分:2)

虽然a & b都获得了锁,但这些锁与对象引用相关联。因此,a & b将能够通过获取不同的锁来在同一点进入同步区域。

  

换句话说 - lock与具体的Object或Super类相关   重要吗?

锁与对象实例相关。

答案 2 :(得分:1)

据我所知,锁定在对象引用上,而不是在类定义上。这意味着那些将是两个不同的锁,因为它们不在同一个对象引用上。请记住,Java中的每个对象都是Object类的子类,因此如果它锁定在最高的超类上,则只能在程序中拥有一个锁。

答案 3 :(得分:1)

有一个不同的锁定,因为锁定在object上。Javadoc

  

首先,两次调用同步方法是不可能的   在同一个对象上进行交错。当一个线程正在执行时   对象的synchronized方法,所有其他调用的线程   同一对象块的同步方法(暂停执行)   直到第一个线程完成对象。

答案 4 :(得分:1)

Basic a = new A();
Basic b = new B();

每个 a b 都有不同的对象引用,所以有不同的锁 因此,用两个不同的锁来调用同步方法会很有用。