- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
请提供一点帮助,请考虑下面的代码。
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/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!