如果经常使用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区别是什么?简单叙述