了解ReentrantLock的实现原理之前先梳理一下它所关联的知识点:
- 首先ReentrantLock是基于AbstractQueuedSynchronizer的,AbstractQueuedSynchronizer是此锁同步控制的基础,使用AQS的状态来表示持有该锁的数量。
- AbstractQueuedSynchronizer中的等待队列是CLS队列锁的变种
- CLS锁是一种基于链表的高性能,可扩展,公平的自旋锁,申请线程仅仅在本地变量上自旋,不断轮询前驱的状态,如果前驱释放了锁就结束自旋。
- CLS代码中用到了ThreadLocal类和AtomicReference(可以保证以原子方式更新对象引用)。CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程须要获取锁,且不释放锁;为false表示线程释放了锁。
- AtomicReference类可以保证引用对象读写的原子性,当多个进程同时操作此引用对象的时候,仅仅有一个线程可以操作。
CAS算法原理。
ReentrantLock有一个抽象类Sync,通过ReentrantLock的构造方法实例化出公平的Sync和非公平的Sync,默认构造非公平锁。(NonfairSync类和FairSync类都继承了抽象类Sync)。
compareAndSetState是AbstractQueuedSynchronizer中的方法,通过compareAndSetState设置state为1。
如果当前的状态值等于期望的状态值,则原子性的设置同步状态为更新的值,此操作使用到了乐观锁CAS。
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
同步状态state是volatile的,volatile关键字保证了变量的内存可见性。
基本概念理清楚后可以查看此博客,作者写的很详细:https://www.cnblogs.com/xrq730/p/4979021.html