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 class有关吗?
答案 0 :(得分: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()
将锁定同一个监视器。
答案 1 :(得分:2)
虽然a & b
都获得了锁,但这些锁与对象引用相关联。因此,a & b
将能够通过获取不同的锁来在同一点进入同步区域。
换句话说 - lock与具体的Object或Super类相关 重要吗?
锁与对象实例相关。
答案 2 :(得分:1)
据我所知,锁定在对象引用上,而不是在类定义上。这意味着那些将是两个不同的锁,因为它们不在同一个对象引用上。请记住,Java中的每个对象都是Object类的子类,因此如果它锁定在最高的超类上,则只能在程序中拥有一个锁。
答案 3 :(得分:1)
有一个不同的锁定,因为锁定在object
上。Javadoc说
首先,两次调用同步方法是不可能的 在同一个对象上进行交错。当一个线程正在执行时 对象的synchronized方法,所有其他调用的线程 同一对象块的同步方法(暂停执行) 直到第一个线程完成对象。
答案 4 :(得分:1)
Basic a = new A();
Basic b = new B();
每个 a 和 b 都有不同的对象引用,所以有不同的锁 因此,用两个不同的锁来调用同步方法会很有用。