| 公平锁:所有线程都老老实实排队 |
| 非公平锁:只要有机会,就先尝试抢占资源 |
| 可能导致后面排队等待的线程等不到相应的cpu资源,从而引起线程饥饿 |
| public class ReentrantLockDemo { |
| |
| public static void main(String[] args) { |
| |
| ReentrantLock reentrantLock = new ReentrantLock(true); |
| reentrantLock.lock(); |
| reentrantLock.unlock(); |
| } |
| |
| } |
| public void lock() { |
| sync.acquire(1); |
| } |
| public final void acquire(int arg) { |
| if (!tryAcquire(arg) && |
| acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) |
| selfInterrupt(); |
| } |
| protected boolean tryAcquire(int arg) { |
| throw new UnsupportedOperationException(); |
| } |
- 查看tryAcquire方法的实现

| static final class FairSync extends Sync { |
| private static final long serialVersionUID = -3000897897090466540L; |
| |
| |
| |
| |
| @ReservedStackAccess |
| protected final boolean tryAcquire(int acquires) { |
| final Thread current = Thread.currentThread(); |
| int c = getState(); |
| if (c == 0) { |
| if (!hasQueuedPredecessors() && |
| compareAndSetState(0, acquires)) { |
| setExclusiveOwnerThread(current); |
| return true; |
| } |
| } |
| else if (current == getExclusiveOwnerThread()) { |
| int nextc = c + acquires; |
| if (nextc < 0) |
| throw new Error("Maximum lock count exceeded"); |
| setState(nextc); |
| return true; |
| } |
| return false; |
| } |
| } |
- 查看hasQueuedPredecessors方法
| public final boolean hasQueuedPredecessors() { |
| Node h, s; |
| if ((h = head) != null) { |
| if ((s = h.next) == null || s.waitStatus > 0) { |
| s = null; |
| for (Node p = tail; p != h && p != null; p = p.prev) { |
| if (p.waitStatus <= 0) |
| s = p; |
| } |
| } |
| if (s != null && s.thread != Thread.currentThread()) |
| return true; |
| } |
| return false; |
| } |
-
ctrl + shift + y翻译

-
继续查看tryAcquire方法的实现
| static final class FairSync extends Sync { |
| private static final long serialVersionUID = -3000897897090466540L; |
| |
| |
| |
| |
| @ReservedStackAccess |
| protected final boolean tryAcquire(int acquires) { |
| final Thread current = Thread.currentThread(); |
| int c = getState(); |
| if (c == 0) { |
| if (!hasQueuedPredecessors() && |
| compareAndSetState(0, acquires)) { |
| setExclusiveOwnerThread(current); |
| return true; |
| } |
| } |
| else if (current == getExclusiveOwnerThread()) { |
| int nextc = c + acquires; |
| if (nextc < 0) |
| throw new Error("Maximum lock count exceeded"); |
| setState(nextc); |
| return true; |
| } |
| return false; |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?