java - 可重入锁定

标签 java concurrency locking reentrancy

请提供一点帮助,请考虑下面的代码。

public class Widget {
    public synchronized void doSomething() {
        ...
    }
}

public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
        System.out.println(toString() + ": calling doSomething");
        super.doSomething();
    }
}

我读到,当 LoggingWidget 中的 doSomething() 被调用时,JVM 将尝试先获取 LoggingWidget 上的锁,然后再获取 Widget 上的锁。

我很想知道原因。是因为 JVM 知道 doSomething() 调用了 super.doSomething() 还是因为调用子类方法也总是会获取父类(super class)的锁。

干杯

最佳答案

你错了——锁是在实例级别获得的。您的示例中只有一个锁,因为当您说时只创建了一个实例:

Widget w = new LoggingWidget

您可以将锁(也称为监视器互斥锁信号量)视为单独“附加”到JVM

如果您在 LoggingWidget 子类上有另一个 synchronized 方法,您会发现这是真的。不可能同时调用此(新)方法和 doSomething 方法 [在同一对象上使用不同的线程]。

这也适用于父类(super class)上的另一个 synchronized 方法(即它不会以任何方式被覆盖的方法影响)。

关于java - 可重入锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104695/

相关文章:

c# - 通过 System.Data.SQLite 和 c# 对单个 SQLite 数据库文件进行多次访问

sql-server - 如何在共享数据库上同时生成唯一的用户名?

php - Linux 服务器上的自动化脚本(不是 cron 作业)

c# - 为参与者 '{actorName}' 获取基于回合的并发锁在 {time} 后超时

php - 防止另一个用户同时插入数据

MYSQL如何确保一个查询紧接着另一个查询运行

java - Eclipse 中出现 ClassNotFoundException,所有包都在同一个 src 文件夹中

java - ClassNotFoundException : com. allen_sauer.gwt.log.client.WrappedClientThrowable

javascript - 如何检索 java Set 并迭代 ajax 调用响应中的值?

java - 使用 Lambda 表达式将字符串列表转换为 Java 中的自定义对象列表