ReentrantLock.hasQueuedThreads()能否始终可靠使用?附设备电源管理场景
关于ReentrantLock.hasQueuedThreads()的可靠性问题
即使所有线程仅调用lock(),官方文档的警告依然有效。
核心原因
hasQueuedThreads()的返回值只是调用瞬间的瞬时状态:
- 即便返回true,后续等待锁的线程仍可能因意外终止(比如线程未捕获异常崩溃、被强制终止)而无法获取锁;
ReentrantLock内部队列的节点存在被取消的可能,即使是使用lock()的线程,也不能完全排除这种底层逻辑带来的不确定性。
这意味着你无法基于这个返回值做出"必然有线程会接管设备"的可靠判断。
针对设备交互场景的替代方案
放弃依赖hasQueuedThreads(),改用访问计数器实现更可靠的逻辑:
- 初始化一个原子计数器:
AtomicInteger deviceAccessCounter = new AtomicInteger(0); - 线程获取锁前,先递增计数器:
deviceAccessCounter.incrementAndGet(); - 获取锁后,检查设备状态,未开机则开机,执行操作
- 释放锁后,递减计数器并判断:
if (deviceAccessCounter.decrementAndGet() == 0) { 关闭设备 }
这种方式直接追踪所有等待/正在操作设备的线程数量,完全避免了原方案中依赖瞬时状态的风险,逻辑更稳定。
内容的提问来源于stack exchange,提问作者gTcV
相关产品推荐
相关产品推荐

