isfair()方法返回锁创建时指定的公平性标志,即构造时是否声明为公平锁;它直接读取final字段fair,不反映运行时调度是否真正公平,且锁创建后该值不可变。

ReentrantLock 的 isFair() 方法直接返回构造时指定的公平性标志,不依赖运行时状态。它不是“判断”当前是否发生了公平调度,而是告诉你这个锁对象**创建时是否被声明为公平锁**。
isFair() 的本质是读取 final 字段
ReentrantLock 内部有一个 final boolean fair 字段,由构造函数传入并固定不变:
-
new ReentrantLock()→ 默认fair = false -
new ReentrantLock(true)→ 显式设置fair = true
isFair() 方法只是简单返回这个字段值,源码等价于:
public boolean isFair() { return sync instanceof FairSync; }
其中 FairSync 是公平锁的同步器实现类,NonfairSync 是非公平锁的实现类 —— 构造时就决定了用哪个子类,之后不会变。
公平性体现在锁获取逻辑,而非 isFair() 的运行时检测
是否“真正公平”,取决于线程争抢锁时的排队和唤醒机制:
- 公平锁(
fair = true):每次lock()都检查同步队列是否有等待者,有则入队,不插队 - 非公平锁(
fair = false):先尝试直接 CAS 抢锁,失败才入队;允许新线程“插队”抢到刚释放的锁
也就是说:isFair() 返回 true,只表示“这个锁承诺按 FIFO 排队”,但不保证当前没有线程正在执行或队列为空;它也不反映某次具体加锁是否“看起来公平”。
使用注意点
- 该方法不可变 —— 锁一旦创建,公平性无法修改
- 不能靠它监控锁的实时调度行为(比如“现在有没有线程插队”)
- 调试或日志中可用它区分锁策略,但业务逻辑不应依赖其动态变化(因为它根本不会变)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











