调试模式下LockSupport.park()出现两次唤醒,是否属于IDE的bug?
这个现象不属于IDE的bug,是Java调试协议(JDWP)的标准实现特性导致的,所有遵循该协议的调试工具都会出现相同表现,具体逻辑如下:
- 首先明确
LockSupport.park()的核心机制:它基于「许可」逻辑运行,只要线程持有可用许可,park()调用就会直接返回,不会阻塞,否则线程会进入阻塞状态直到获得许可。 - 第一次唤醒是代码中主动调用
thread.interrupt()触发的:中断操作会给线程发放park许可,同时标记线程中断状态为true,所以Thread.interrupted()返回true并清除中断标记,和正常运行的逻辑完全一致。 - 第二次唤醒是调试器的断点逻辑导致的:当断点触发线程暂停后,调试器为了读取当前线程的上下文状态、支持表达式求值等调试功能,会隐式给目标线程发放一次park许可,该许可不会附带中断标记。等恢复线程运行后,代码回到循环再次调用
LockSupport.park()时,会直接消耗掉调试器发放的这个许可直接返回,此时没有中断标记,所以Thread.interrupted()返回false,也就出现了断点两次触发的现象。
你可以通过以下方式验证该逻辑:将断点设置为仅挂起当前调试线程,或者关闭调试器的自动状态检查、隐式表达式求值功能,即可复现正常运行时的输出结果。
内容的提问来源于stack exchange,提问作者zysaaa
相关产品推荐
相关产品推荐

