synchronized方法覆盖 - 线程获取哪个对象的锁定?

时间:2017-04-16 18:46:19

标签: java multithreading reentrancy

这个问题来自于Java Concurrency in Practice的一个例子。在本书的第2章中,我们得到了一个这样的例子,我并没有完全复制它。让我们说我们有以下代码块

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

现在我们创建一个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()

  2. 然后控制到达超类的方法1,它获取锁定的对象?因为我没有创建任何A类的对象。

    1. 这种行为如何与Reentrancy相关联?

1 个答案:

答案 0 :(得分:1)

由于只有B的实例,因此该对象的监视器将被获取。

super.method1()电话也会获得监控(重新进行)。该对象仍为B,因为仍然从this(即同一个实例)获取了监视器,因此在超类中定义该方法没有区别。