对象内置锁ObjectMonitor

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。用于分析和调试目的,跟踪锁的历史持有者。
  } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值