0
abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public void aMethod(){
        //Some actions here
    }
}

public class B extends Basic{
    public void bMethod(){
        //Some actions here
    }
}

Basic a = new A();
Basic b = new B();

a.basicMethod(); // acquires lock
b.basicMethod(); //Same lock?

换句话说 - 锁与具体的 Object 或 Super 类相关也很重要吗?

4

5 回答 5

5

不同的锁。实例方法在synchronized与该特定对象实例a关联的监视器上同步,因此每个实例b都有自己的监视器。

如果你有

abstract class Basic (){
    public synchronized void basicMethod(String string){
        //Some actions here
    }
}

public class A extends Basic{
    public synchronized void aMethod(){
        //Some actions here
    }
}

然后调用a.basicMethod()a.aMethod()锁定同一个监视器。

于 2012-12-10T17:18:53.123 回答
2

尽管两者都a & b获得了锁,但这些锁与对象引用相关联。因此a & b,两者都可以通过获取不同的锁在同一点进入它们的同步区域。

换句话说 - 锁与具体的 Object 或 Super 类相关也很重要吗?

锁与对象实例有关。

于 2012-12-10T17:18:38.443 回答
1

据我所知,锁定是在对象引用上,而不是在类定义上。这意味着这将是两个不同的锁,因为它们没有保存在同一个对象引用上。请记住,Java 中的每个对象都是 Object 类的子类,因此如果它锁定在最高超类上,那么程序中就只能有一个锁定。

于 2012-12-10T17:19:42.947 回答
1

有不同的锁,因为锁被持有在一个object. Javadoc

首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

于 2012-12-10T17:22:40.330 回答
1
Basic a = new A();
Basic b = new B();

每个ab具有不同的对象引用,因此具有不同的锁,因此会调用具有两个不同锁的同步方法。

于 2012-12-10T17:23:44.790 回答