如果经常使用reentrantlock的话,它的底层原理就一定要了解透彻,否则很有可能报错都找不着原因,本篇文章就跟着小编来了解下它的原理。
AbstractQueuedSynchronizer
Java中想要实现ReentrantLock前提就是它了,一般我们简称为AQS,是java.util.concurrent包的核心,CountDownLatch、FutureTask、semaphore、ReentrantLock等都有一个内部类是这个抽象类的子类。先用两张表格介绍一下AQS。首先是Node,因为AQS是基于FIFO队列的实现,所以必然存在一个个节点,Node就是一个节点,Node里面有:
下面再看一下AQS中有哪些变量和方法:
ReentrantLock实现
在ReentrantLock中有一个抽象类Sync:
private final Sync sync;
/**
* Base of synchronization control for this lock. Subclassed
* into fair and nonfair versions below. Uses AQS state to
* represent the number of holds on the lock.
*/
abstract static class Sync extends AbstractQueuedSynchronizer
{
...
}ReentrantLock根据传入构造方法的布尔型参数实例化出Sync的实现类FairSync与NonfairSync,分别表示公平的Sync和非公平的Sync。因为在ReentrantLock中我们用的比较多的是非公平锁,所以来看下非公平锁是如何实现的。例如线程a调用了ReentrantLock的lock()方法,那么线程a将会独占锁,如下:

以上就是关于reentrantlock原理的所有内容,对于一些java常见问题及解决方法还有疑问的小伙伴可以持续关注我们查看答案。
推荐阅读:
Synchronized和Reentrantlock区别是什么?简单叙述