Java:超类中的同步方法获取与子类中的同步方法相同的锁,对吗?

2022-09-01 23:27:47
class A {
    public synchronized void myOneMethod() {
        // ...
    }
}

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

// ...

B myObject;

// ...

myObject.myOneMethod(); // acquires lock
myObject.myOtherMethod(); // same lock?

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


答案 1

是的,你是对的,你的解释也是对的。没什么可补充的。

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

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


答案 2

是的,同步等效于已同步(this)。

准确地说

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


推荐