Java: A synchronized method in the superclass acquires the same lock as one in the subclass, right?

后端 未结 7 824
闹比i
闹比i 2021-02-12 10:12
class A {
    public synchronized void myOneMethod() {
        // ...
    }
}

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


        
相关标签:
7条回答
  • 2021-02-12 10:26

    If you want to be more explicit about your locking, you could do something like this:

    class A {
    
        protected final Object  mutex = new Object();
        public void myOneMethod() {
            synchronized (mutex) {
                // ...
            }
        }
    }
    
    class B extends A {
        public  void myOtherMethod() {
            synchronized (mutex) {
                // ...
            }
        }
    }
    

    In fact, this pattern is recommended by Brian Goetz in Java Concurrency in Practice, section 4.2.1 "The Java monitor pattern". That way you know exactly where your monitor is coming from.

    0 讨论(0)
  • 2021-02-12 10:36

    Yes you are correct

    When one thread is executing a synchronized method for an object, all other threads that invoke synchronized methods for the same object block (suspend execution) until the first thread is done with the object. In this case the object is B

    0 讨论(0)
  • 2021-02-12 10:40

    Yes. Java uses "monitors" to implement synchronization, and synchronized methods use the object instance they're called on as monitor, which is obviously the same in this case.

    Note that this is NOT true for static methods! There, the class instance of (I think) the declaring class is used, which would not be the same one.

    0 讨论(0)
  • 2021-02-12 10:43

    Yes, synchronized is equivalent to synchronized(this).

    To be more precise:

    For a class (static) method, the lock associated with the Class object for the method's class is used. For an instance method, the lock associated with this (the object for which the method was invoked) is used.

    0 讨论(0)
  • 2021-02-12 10:46

    Yes, you are right, and you got the explanation right too. Nothing much to add.

    Note that if the methods were static, then they would synchronize on different objects, namely their respective classes (A and B).

    EDIT: Why am I sure? I don't know, why are you not sure? ;-) myObject is just one object - there isn't any distinction between the myObject attributes that come from class A and those that come from class B. (Well, technically you could probably use reflection to find out which are which, so there must be some distinction, but forget about reflection for now. For common operations on the object there's no distinction.)

    0 讨论(0)
  • 2021-02-12 10:46

    Just a small addition for people who might be interested in the future..

    Additionally remember that locks in Java are reentrant. If they were not this code of yours would result in a deadlock since as you've indicated both operations require the same lock.

    0 讨论(0)
提交回复
热议问题