发布于2026-07-11 阅读(0)
扫一扫,手机访问
是的,ReentrantLock构造函数传true确实能开启公平锁,让线程按FIFO顺序竞争锁。但严格来说,这个公平性只覆盖了阻塞后重新竞争的场景。换句话说,它并不能解决因持锁时间过长、未及时释放、或者混用不同锁实例所导致的饥饿问题。而且,公平锁的性能损耗相当可观,这一点必须心里有数。

很多人以为,ReentrantLock的构造函数里传个true就能万事大吉 —— "看好了,我要公平模式了!" —— 然后等着线程们乖乖按顺序排队领锁对吧?这么说没有问题但不能算完整答案。
ReentrantLock默认是非公平锁,true的含义是把它的候队旗换成 FIFO 模式而已:
ReentrantLock lock = new ReentrantLock(true);
`true`版本会让它们老老实实排队吗?答案是肯定的 —— 仅限于它们已经在等待队列里趴着的状态下。线程刚调用`lock()`但还没阻塞时,依然有可能嗅到躲在锁刚释放那一瞬的机会,抢先插进去占上几秒钟(这点和非公平锁如出一辙)。不过老规矩:一旦真的卡进队列,那就老老实实先来后到。
有些同学大概会问:我都把标志设成`true`了,咋还是有线程像多余的外卖箱一样在队列里站岗?这背后其实藏着几个常见的踩坑现场:
老话说得好:鱼与熊掌不可兼得,给这么“讲道理”的锁多付出的代价还真不小。拿数据来说的话,公平锁会显著压扁整体吞吐能力,尤其是在高并发搏杀下——
一口气说透:公平锁只是解决了“谁先到谁先上”的排队贞操问题,但它对付不了线程饥饿的根本病因。
如果某个线程手持锁5秒不放,哪怕它是队首透明人,后面排队的100个线程也只能干等5秒 —— 这根本不关调度的事,是设计本身有坑。
所以一句话:公平锁暴露出的只是“谁先拿谁先上”的单薄语义,它会把代码里任何低效或遗漏的毛病毫不留情地摊在太阳底下。而线程饥饿真正的根因,还是藏在锁粒度、临界区长度以及错误恢复逻辑中,不是那个构造函数的传参就能转得了向的。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8