同步方法重写-线程获取哪个对象的锁?
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 线程。
我的问题是:
因为我这里有同步方法锁定哪个对象线程?我只创建 B 对象,对于 B 的 "method1" 我可以想到线程获取 B 对象的锁,但是在执行以下代码时
super.method1()
然后控制权到达超级 class 的方法 1 它获取了哪个对象的锁?因为我还没有创建 class A.
的任何对象
- 这种行为如何与重入相关联?
因为只有B
的一个实例,那就是要获取监听器的对象
super.method1()
调用也获取监视器(重新进入)。对象仍然是 B
,在超类中定义该方法没有区别,因为监视器仍然是从 this
获取的(即完全相同的实例)。
这个问题来自 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 线程。
我的问题是:
因为我这里有同步方法锁定哪个对象线程?我只创建 B 对象,对于 B 的 "method1" 我可以想到线程获取 B 对象的锁,但是在执行以下代码时
super.method1()
然后控制权到达超级 class 的方法 1 它获取了哪个对象的锁?因为我还没有创建 class A.
的任何对象- 这种行为如何与重入相关联?
因为只有B
的一个实例,那就是要获取监听器的对象
super.method1()
调用也获取监视器(重新进入)。对象仍然是 B
,在超类中定义该方法没有区别,因为监视器仍然是从 this
获取的(即完全相同的实例)。