gpt4 book ai didi

java - 同步方法的锁定行为

转载 作者:行者123 更新时间:2023-11-30 05:48:42 26 4
gpt4 key购买 nike

一位开发人员与我争论,如果我们从 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/

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