reentrantlock底层原理是什么?实现原理解析

TheDisguiser 2020-08-06 16:38:00 java常见问答 5448

如果经常使用reentrantlock的话,它的底层原理就一定要了解透彻,否则很有可能报错都找不着原因,本篇文章就跟着小编来了解下它的原理。

AbstractQueuedSynchronizer

Java中想要实现ReentrantLock前提就是它了,一般我们简称为AQS,是java.util.concurrent包的核心,CountDownLatch、FutureTask、semaphore、ReentrantLock等都有一个内部类是这个抽象类的子类。先用两张表格介绍一下AQS。首先是Node,因为AQS是基于FIFO队列的实现,所以必然存在一个个节点,Node就是一个节点,Node里面有:

reentrantlock底层原理  实现原理

下面再看一下AQS中有哪些变量和方法:

reentrantlock底层原理  实现原理

reentrantlock底层原理  实现原理

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底层原理  实现原理

以上就是关于reentrantlock原理的所有内容,对于一些java常见问题及解决方法还有疑问的小伙伴可以持续关注我们查看答案。

推荐阅读:

Synchronized和Reentrantlock区别是什么?简单叙述

java reentrantlock怎么使用?概念和使用详解

ReentrantLock属于乐观锁还是悲观锁?