这个问题来自于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线程。
我的问题是:
因为我在这里有一个对象线程被锁定的同步方法?我只创建B对象,对于B的“method1”我可以想到线程获取B对象上的锁,但是在执行下面的代码时
super.method1()
然后控制到达超类的方法1,它获取锁定的对象?因为我没有创建任何A类的对象。
答案 0 :(得分:1)
由于只有B
的实例,因此该对象的监视器将被获取。
super.method1()
电话也会获得监控(重新进行)。该对象仍为B
,因为仍然从this
(即同一个实例)获取了监视器,因此在超类中定义该方法没有区别。