Java:超类中的synchronized方法获取与子类中的同一个锁,对吧?

Han*_*etz 17 java concurrency

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

class B extends A {
    public synchronized void myOtherMethod() {
        // ...
    }
}

// ...

B myObject;

// ...

myObject.myOneMethod(); // acquires lock
myObject.myOtherMethod(); // same lock?
Run Code Online (Sandbox Code Playgroud)

我如何理解同步模型,我会说是的,确实如此,因为锁/监视器与实例myObject相关联,并且定义方法的位置并不重要.但我是对的吗?如果没有,为什么?如果是的话,你为什么确定,我不是?:-)

Dav*_*d Z 13

是的,你是对的,你也得到了正确的解释.没什么可补充的.

请注意,如果方法是静态的,那么它们将在不同的对象上同步,即它们各自的类(A和B).

编辑:为什么我确定?我不知道,你为什么不确定?;-) myObject只是一个对象 - myObject来自A类的属性和来自B类的属性之间没有任何区别.(从技术上讲,你可以使用反射来找出哪些是哪个,所以必须有一些区别,但暂时忘记了反思.对于对象的常见操作没有区别.)


pgr*_*ras 7

是的,synchronized等同于synchronized(this).

确切地说:

对于类(静态)方法,使用与方法类的Class对象关联的锁.对于实例方法,使用与此关联的锁(调用该方法的对象).