据我所知,每个Java对象都可以用作监视器。如果与对象关联的条目计数为零,则线程可以获得锁。如果同一线程获取锁,则条目计数通过“monitorenter”操作码递增,并在同一线程在“monitorexit”期间释放代码时递减。该条目计数存储在哪里?它是如何链接到Java对象的?创建对象时会分配它吗?
最佳答案
每个 JVM 可能有不同的内在锁实现。对于HotSpot JVM,它根本不计算锁条目,而是使用monitorenter
/monitorexit
字节码在方法的堆栈帧中保留插槽。
HotSpot JVM 有两种 Java 监视器机制:
- 偏向锁。通过将线程 ID 放入对象头中,对象“偏向”给定线程。那么给定线程中的锁定和解锁几乎是无操作:JVM 只需验证偏向锁标记是否仍在对象头中。
- 常规递归锁。如果方法具有
synchronized
block (即monitorenter
/monitorexit
)字节码,则堆栈上保留一个位置来记录锁定信息:一个对象及其移位的 header (即锁定之前的 header 值)。如果对象被递归锁定,则移位的 header 包含零,因此虚拟机知道它不应在monitorexit
上更新对象 header 。
更多详细信息请参见HotSpot sources .
关于java - Java 中存储的对象的条目数在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43152226/