Java 同步重写方法:获取父类和子类顺序的内在锁

Java 同步重写方法:获取父类和子类顺序的内在锁,java,multithreading,locking,Java,Multithreading,Locking,在重写的非静态同步方法中持有哪些锁。 请提供获取和释放基类和子类的监视器锁的顺序,以便解释java中重入的好处。如果可以借助JVM为实现可重入性而维护的拥有线程和获取计数来解释序列,那就太好了 public class Widget { public synchronized void doSomething() { } } public class LoggingWidget extends Widget { public synchronized void doSo

在重写的非静态同步方法中持有哪些锁。 请提供获取和释放基类和子类的监视器锁的顺序,以便解释java中重入的好处。如果可以借助JVM为实现可重入性而维护的拥有线程和获取计数来解释序列,那就太好了

public class Widget {
    public synchronized void doSomething() {
    }
}

public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
        super.doSomething();
    }
}

请注意,此问题专门用于解释隐式可重入锁,因此请不要将其标记为重复。

每个对象都有一个关联的监视器。在对象上调用同步实例方法时,与此对象关联的监视器需要由调用线程持有


对象的类是不相关的

如果线程正在子类中执行doSomething(),则在下一行中,它将尝试获取超类的监视器。超级类doSomething()也会尝试获取自身的锁。那么,哪一个先发生?不,doSomething()是一个实例方法。所以它在对象上被调用。这里只涉及一个对象,它是子类的一个实例,也是超类的一个实例。既然您已经命名为“reentrancy”,我假设您已经知道它是刚刚获得两次的同一个锁。那么只有一个可能的订单。程序执行的顺序。其他的一切都没有意义。单计数器的递增顺序并不重要…