gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:24:08 25 4
gpt4 key购买 nike

这个问题是我从 Java 并发实践的一个例子中想到的。在本书的第二章中,我们得到了一个这样的例子,我并没有完全复制它。假设我们有以下代码块

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()

控制随后到达父类(super class)的 method1,它在哪个对象上获取锁?因为我还没有创建任何 A 类的对象。

  • 这种行为与重入有何联系?
  • 最佳答案

    由于只有一个 B 实例,因此这就是将获取其监视器的对象。

    super.method1() 调用还会获取监视器(可重入)。该对象仍然是 B,该方法在父类(super class)中定义没有区别,因为监视器仍然是从 this 获取的(即同一个实例)。

    关于java - 同步方法重写 - 线程获取哪个对象的锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43440789/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com