ObjectMonitor 是 HotSpot JVM 实现中用于对象监视器(即同步监视器)的数据结构。它用于实现 Java 中的 synchronized 关键字和 wait/notify 机制。
// initialize the monitor, exception the semaphore, all other fields
// are simple integers or pointers
ObjectMonitor() {
_header = NULL; //指向对象头的指针。对象头包含了对象的元数据,包括哈希码、GC 状态、锁信息等。
_count = 0; //记录当前持有锁的线程的重入次数。当一个线程多次进入一个同步块(重入锁)时,这个计数器会增加。
_waiters = 0, //记录当前在等待锁的线程数量。通常用于 wait 操作,表示当前等待在这个监视器上的线程数。
_recursions = 0; //与_count 类似,记录锁的重入次数,帮助管理线程重入锁的深度。
_object = NULL; //指向当前被监视的 Java 对象。这个字段指向被锁定的对象。
_owner = NULL; //指向当前持有锁的线程。这个字段用来标识哪个线程当前拥有这个监视器的锁。
_WaitSet = NULL; // 等待队列。包含所有调用 wait 方法后等待通知的线程。
_WaitSetLock = 0 ; //用于保护 _WaitSet 的锁,确保对等待队列的操作是线程安全的。
_Responsible = NULL ; // 指向被选中的负责者线程(用于锁竞争情况),通常是一个正在争夺锁的线程。
_succ = NULL ; // 指向下一个成功获得锁的线程。用于优化锁的传递。
_cxq = NULL ; //挂起队列(Contention Queue)。包含所有试图获取但未能获得锁的线程。
FreeNext = NULL ; //指向下一个空闲的 ObjectMonitor,用于监视器的管理和回收。
_EntryList = NULL ; // 入口队列。包含所有等待获取锁的线程,即那些试图进入同步块但未能进入的线程。
_SpinFreq = 0 ; //自旋频率。自旋锁中,指示线程自旋的频率或次数。
_SpinClock = 0 ; //自旋时钟。用于跟踪自旋的时机或次数,帮助优化自旋行为。
OwnerIsThread = 0 ; //标志位,指示 _owner 是否指向一个线程对象。用于区分 _owner 字段的状态。
_previous_owner_tid = 0; //记录上一个持有锁的线程的 ID。用于分析和调试目的,跟踪锁的历史持有者。
}