同步方法重写-线程获取哪个对象的锁?

synchronized method override- thread acquires lock on which object?

这个问题来自 Java 并发实践的一个例子。在本书的第 2 章中,我们得到了一个这样的例子,我并没有完全照搬那个。假设我们有以下代码块

class A{
 synchronized void method1(){
  do some stuff..
  }
}
class B extends A{
  synchronized void method1(){
  super.method1();
  }
}

现在我们创建一个 class B 的对象并执行以下操作,这在 public static void main 下。

B b=new B()
Thread t1=new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            b.method1();
        }
    });
 Thread t2=new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            b.method1();
        }
    });

然后启动 t1 和 t2 线程。

我的问题是:

  1. 因为我这里有同步方法锁定哪个对象线程?我只创建 B 对象,对于 B 的 "method1" 我可以想到线程获取 B 对象的锁,但是在执行以下代码时

    super.method1()

然后控制权到达超级 class 的方法 1 它获取了哪个对象的锁?因为我还没有创建 class A.

的任何对象
  1. 这种行为如何与重入相关联?

因为只有B的一个实例,那就是要获取监听器的对象

super.method1() 调用也获取监视器(重新进入)。对象仍然是 B,在超类中定义该方法没有区别,因为监视器仍然是从 this 获取的(即完全相同的实例)。