一位开发人员与我争论,如果我们从 objectA 中的另一个同步方法调用 objectB 中的同步方法,那么获取 objectB 上的对象锁不需要额外的成本,因为我们已经拥有了 objectA 上的锁。我该如何反驳这一点?
开发者同伴理论 - “当您调用同步方法时,线程会获取该方法中使用的所有对象的锁。”
class ObjectA {
public synchronized void methodA() {
methodB();
// do something else
}
}
class ObjectB {
public synchronized void methodB() {
// do something
}
}
最佳答案
告诉您的开发同事:
执行静态同步方法的线程持有类的锁,执行非静态同步方法的线程持有该方法所在对象的锁已被调用。 (这两个锁是不同的,并且这些线程不会互相阻塞)。
举个例子:
public class Counter {
private int count = 0;
public void increment() {
synchronized (this) {
count++;
}
}
public int getCount() {
synchronized (this) {
return count;
}
}
}
创建的每个 Java 对象,包括加载的每个类,都有一个关联的锁或监视器。
将代码放入同步块(synchronized block)中会使编译器附加指令以在执行代码之前获取指定对象上的锁,并在执行后释放它(因为代码正常完成或异常完成)。
在获取锁和释放锁之间,线程被称为“拥有”锁。当线程A想要获取锁时,如果线程B已经拥有该锁,那么线程A必须等待线程B释放它。
In your case, methodB() will be called on object of class ObjectB as it is a non-static method.
So, while entering methodB(), a lock on object(on which the method is being called) of class ObjectB will be owned by the thread as soon as it sees methodB() is synchronized.
关于java - 同步方法的锁定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54370374/