作者简书ID:小北觅
学习AQS的时候,了解到AQS依赖于内部的FIFO同步队列来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个Node对象并将其加入到同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。
这时,我有了一个疑问,AQS的同步队列是FIFO的,就是先来排队的先走。那怎么实现非公平锁呢?查阅了一些资料,总算知道了。
首先从公平锁开始看起。

ReentrantLock 的公平锁

ReentrantLock 默认采用非公平锁,除非在构造方法中传入参数 true 。
//默认 publicReentrantLock(){sync=newNonfairSync();}//传入true or false publicReentrantLock(booleanfair){sync=fair?newFairSync():newNonfairSync();}

公平锁的 lock 方法:

staticfinalclassFairSyncextendsSync{finalvoidlock(){acquire(1);}// AbstractQueuedSynchronizer.acquire(int arg) publicfinalvoidacquire(intarg){if(!tryAcquire(arg)&&acquireQueued(addWaiter(Node.EXCLUSIVE),arg))selfInterrupt();}protectedfinalbooleantryAcquire(intacquires){finalThreadcurrent=Thread.currentThread();intc=getState();if(c==0){// 1. 和非公平锁相比,这里多了一个判断:是否有线程在等待 if(!hasQueuedPredecessors()&&compareAndSetState(0,acquires)){setExclusiveOwnerThread(current);returntrue;}}elseif(current==getExclusiveOwnerThread()){intnextc=c+acquires;if(nextc