java - 同步方法的锁定行为

标签 java synchronization

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

相关文章:

php - 在 PHP 中将 Firebird 与 MySQL 同步

multithreading - 'critical section algorithm' 中的进度和有限等待是什么?

java - 查询一组资源的高效同步

java - 如何处理数字求和方法

java - 如何在 Spring Boot 应用程序中使用 Hibernate Validation 进行 Bean 验证?

java - 使用 JDBC PreparedStatement 在 MySql 中返回生成的键

JavaFX 从 TabContent(Node) 访问 Tab 或 TabPane

opengl - 使用 SSBO 作为下一次绘制调用的 VBO 输入

java - 将 JComponent 作为图像发送

ios - 同步 iOS 设备和索尼运动相机 HDR-AS200V。获取完整的有声电影