AQS的智慧:短暂自旋 + 深度阻塞

📅 发布时间:2026/7/3 17:35:49 👁️ 浏览次数:
AQS的智慧:短暂自旋 + 深度阻塞
面试的时候被问到AQS怎么实现高性能很多人可能一上来就背教科书什么CLH队列、state变量。但AQS真正有意思的地方在于它把乐观和悲观两种思路玩明白了。先试试不行再排队AQS核心就两个东西一个volatile的state变量表示状态一个CLH双向队列管等待的线程。线程来拿锁的时候第一反应不是我要等着而是我试试能不能直接拿到。直接用CAS去改state改成功就完事了连阻塞都不用全程无开销。如果CAS失败了说明有人在抢这时候才去排队。排队也讲究策略入队也不是傻等着AQS用的是无锁入队——用CAS把节点插到队列尾部。插队之后线程会做一个自旋判断如果自己是队列里的老二就再tryAcquire一次。为什么给第二次机会赌的就是前一个线程刚好释放锁。概率虽小但一旦赌中成本极低比直接park省了一次上下文切换。自旋几次还是拿不到怎么办调用LockSupport.park()把自己挂起。等前一个节点释放锁时把它唤醒。总结一下AQS这套组合拳打下来CAS乐观尝试——能不动用阻塞就不动无锁入队——快速进入排队系统短暂自旋——给一次捡漏机会最终park——竞争激烈时切到零消耗模式说白了就是一句话先试试失败了再等别一上来就把线程搞休眠。成本从低到高层层递进就是AQS性能还行的秘密。