在 Java 多线程中,公平锁(Fair Lock)并不是“必须使用的锁”,而是一种权衡选择。是否使用公平锁,取决于你对公平性、吞吐量、响应性的要求。
下面从「为什么会有公平锁」「它解决什么问题」「代价是什么」三个角度说明。
在 非公平锁(默认) 下:
这会带来一个问题:线程饥饿(Starvation)
某些线程长期得不到执行机会
保证线程按照“请求锁的顺序”来获取锁
例如:
非公平锁可能导致:
高频线程一直抢到锁,低频线程永远等不到
公平锁可以保证:
哪怕你慢,只要你先来,就先执行
例如:
如果业务上要求:
谁先请求,谁先处理
那么用公平锁更自然。
非公平锁在高并发下:
公平锁:
公平锁必须:
导致:
非公平锁允许:
刚释放锁的线程立刻再拿锁(热锁复用)
这在很多场景下性能更好。
ReentrantLock lock = new ReentrantLock(true); // true = 公平锁
true:公平锁false(默认):非公平锁✅ 适合用:
❌ 不适合用:
公平锁是为了“公平”,不是为了提高性能。
它解决的是“谁能先拿到锁”的问题,代价是牺牲吞吐量。
如果你愿意,我也可以帮你:
synchronized 和 ReentrantLock免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。