Java Flight Recorder中ReentrantLock未出现在Java Monitor Wait板块问询
ReentrantLock机制与JFR观测问题解答
ReentrantLock的实现机制
ReentrantLock是JDK层面实现的显式锁,底层基于AbstractQueuedSynchronizer(AQS)框架实现,全程通过Java代码完成加锁、解锁、队列调度逻辑,不依赖JVM内置的对象监视器(Monitor)机制。
为什么没有出现在Java Monitor Wait板块
Java Monitor Wait分类下的事件仅针对JVM内置的synchronized锁生成:只有使用synchronized关键字抢占锁、调用wait()方法等待的动作,才会被记录到这个板块。ReentrantLock作为显式锁,竞争逻辑完全脱离JVM内置Monitor,自然不会触发这类事件。
JFR中观测ReentrantLock的正确方式
ReentrantLock发生锁竞争时,底层会调用LockSupport.park()挂起等待线程,你需要在JFR事件中查找对应分类:
- JDK 11及以上版本,内置
jdk.LockSupport.Park事件,可在事件浏览器中搜索Park筛选查看显式锁的等待事件 - JDK 8版本需要手动开启
com.oracle.jdk.LockSupportPark事件,才能捕获到相关的挂起行为
测试未观测到200万次事件的原因
即使你硬编码someFunction()始终返回true,也不会产生200万次锁等待事件,核心原因是无锁竞争时不会生成JFR阻塞事件:
- 只有当线程尝试加锁失败、需要进入队列挂起等待锁释放时,才会生成对应的Park事件。如果你的测试场景下没有多线程竞争同一把锁,或者锁持有时间极短,大部分加锁操作都能直接成功,自然不会产生大量可观测的等待事件。
内容的提问来源于stack exchange,提问作者Tim Seevrs
相关产品推荐
相关产品推荐

