1.1 同步队列:队列中存放排队等待锁的线程,每个线程放入队列时会被包装为Node类,如下图。
1.2 抢锁:调用lock方法,如果抢锁成功(CAS成功,或者是重入——state计数加1),那么initialTryLock方法返回true,如下图。如果失败,再重新acquire尝试一次。尝试之后还是失败,那么将当前线程放入AQS等待队列中,并通过LockSupport的park方法挂起当前线程。
抢锁时,公平锁FairSync和非公平锁NonFairSync的区别就是公平锁FairSync在抢锁时会判断当前等待队列中是否有线程在等待,如下图所示。
1.3 释放锁:因为存在重入,所以state减到0,才说明锁完全释放。