ReentrantLock的底层实现原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock的底层实现原理相关的知识,希望对你有一定的参考价值。

参考技术A

ReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似。

CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。 当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则重新获取内存地址V的当前值,并重新计算想要修改的值(重新尝试的过程被称为自旋) 。修改变量的操作是一个原子操作,要么完成修改,要么完全没改;CAS被广泛的应用在Java的底层实现中。 在Java中,CAS主要是由sun.misc.Unsafe这个类通过JNI调用CPU底层指令实现

AbstractQueuedSynchronizer简称AQS,是一个用于构建锁和同步容器的框架。事实上concurrent包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解决了在实现同步容器时设计的大量细节问题。

AQS使用一个FIFO的队列表示排队等待锁的线程,队列头节点称作“哨兵节点”或者“哑节点”,它不与任何线程关联。其他的节点与等待线程关联,每个节点维护一个等待状态waitStatus

ReentrantLock的基本实现可以概括为: 先通过CAS尝试获取锁。如果此时已经有线程占据了锁,那就加入AQS队列并且被挂起。当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁。 在这个时候,如果:
非公平锁 :如果同时还有另一个线程进来尝试获取,那么有可能会让这个线程抢先获取;
公平锁 :如果同时还有另一个线程进来尝试获取,当它发现自己不是在队首的话,就会排到队尾,由队首的线程获取到锁。

以上是关于ReentrantLock的底层实现原理的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantLock底层原理手写Lock锁

synchronized和ReentrantLock底层原理差别

ReentrantLock使用Condition实现线程的等待和唤醒

深入理解AbstractQueuedSynchronizerReentrantLock底层实现原理

ReentrantLock实现原理

java可重入锁(ReentrantLock)的实现原理