ReentrantLock内部由Sync类实现,Sync类是ReentrantLock的一个内部类,该类继承自AbstractQueuedSynchronizer,该类继承自AbstractOwnableSynchronizer,AbstractOwnableSynchronizer中持有一个exclusiveOwnerThread,表示当前持有锁的线程。

Sync类是一个抽象类,它有两个实现类:FairSync和NonFairSync,分别代表公平锁和非公平锁。

非公平锁和公平锁实现类似,前者相对简单,在AbstractQueuedSynchronizer中有一个整型state变量,在Java中通过Unsafe类提供的CAS来操作state变量,用于表示锁是否获取(0表示当前没有线程获取锁,反之非0)

在非公平锁中,首先尝试cas(state),如果成功,则表示当前线程获取锁,此时将exclusiveOwnerThread设置为当前线程,否则会判断state是否为0,如果是,则再次cas(state),否则判断当前锁的持有者是否是当前线程,如果是,则state加一操作,否则获取锁失败。然后将当前线程加入等待队列,然后以自旋的方式等待锁。

公平锁和非公平锁实现过程差别不大,差别在于,如果是非公平锁的话,当某个线程调用lock方法时,它不会抢占式的去设置同步状态(即state的值),而不是直接调用 acquire 将线程放入同步队列中等待获取锁,当抢占失败,才会放入队列中等待锁。除此之外,在调用tryAcquire时,公平锁每次回判断是否有线程比当前线程等待时间更长,如果有,则让队列中第一个线程获取锁。

参考:
https://www.cnblogs.com/xrq730/p/4979021.html

http://www.cnblogs.com/nullllun/p/9004309.html