一个开发人员正在与我争论,如果我们从objectB中的另一个方法调用objectB中的一个同步方法,那么获得对objectB上的对象的锁定不会产生任何额外的开销,因为我们已经对objectA进行了锁定。我该如何反驳?
资深开发者理论- “当您调用同步方法时,线程会在该方法中使用的所有对象上获得锁定。”
class ObjectA {
public synchronized void methodA() {
methodB();
// do something else
}
}
class ObjectB {
public synchronized void methodB() {
// do something
}
}
答案 0 :(得分:1)
告诉您的开发者其他人
执行静态同步方法的线程持有该类的锁,而执行 non-satic同步方法的线程持有该方法的对象的锁已被调用。 (这两个锁是不同的,并且这些线程不会互相阻塞)。
例如:
set
创建的每个Java对象(包括加载的每个Class)都具有关联的锁或监视器。
将代码放入同步块中可使编译器在执行代码之前追加指令以获取对指定对象的锁定,然后再释放(由于代码正常或异常完成)。
在获取锁并将其释放之前,有一个线程被称为“ 拥有”锁。在想要获取锁的线程A处,如果线程B已经拥有它,那么线程A必须等待线程B释放它。
在您的情况下,将在类 ObjectB 的对象上调用 methodB(),因为它是非静态方法。
因此,在输入 methodB()时,线程将尽快拥有该类 ObjectB 的对象(在其上调用方法的)锁。它会看到 methodB()已同步 。