码迷,mamicode.com
首页 > 其他好文 > 详细

ReentrantLock 源码分析

时间:2020-04-12 16:07:01      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:topic   展开   讲解   问题   模板   nod   默认值   apt   释放   

1. 什么是reentrantlock?

Reentrantlock 顾名思义重入锁,表示这个锁是可以重复进入的,你可能要问了,什么情况下才可以重复进入呢? Good question, 重入的意思是:当一个线程持有某个锁的时候,在它没有释放锁之前去干的其他的事情,那么当他干完其他的事情之后,它不需要再和其他线程竞争该锁,可以直接获得,这就是重入的意思。

2. 为什么要使用Reentrantlock?

使用synchronized 不是更简单吗?为什么还要使用Reentrantlock呢? 是的在大多数情况下这两个锁都可以满足我们。

这就需要分析以下synchronized和Reentrantlock的区别了,先简单的说一下,(因为这个问题如何需要展开说的话需要重开一个topic)。因为Reentrantlock支持公平锁和非公平锁,支持指定获取锁等待的时间避免死锁。

3. Reentrantlock底层是如何实现的?

解读Reentrantlock的源码避免不了讲解AQS(AbstractQueuedSynchronizer) 一个CLH锁的java实现。AbstractQueuedSynchronizer中有几个重要的属性state,Node(双向链表);其中state被volatile修饰,表示任意一个线程使用的state的值都是最新的(volatile的可见性),其默认值0,表示没有被线程持有可以获取锁。

技术图片

 

 

 技术图片

 

 

 Reentrantlock内部维护了一个Sync类,这个同步类继承AbstractQueuedSynchronizer

技术图片

 

 

 Reentrantlock获取锁的大部分逻辑都是AbstractQueuedSynchronizer类中,该类中有一个抽象的方法:tryAcquire,

技术图片

 

 

 

这里使用了模板模式(设计模式),

上面我们讲到Reentrantlock支持公平锁和非公平锁从下面代码可以看到是继承了Sync类

技术图片

 

 

 FairSync 和NonfairSync里面实现了AbstractQueuedSynchronizer. tryAcquire方法。

下面进入Reentrantlock获取锁的具体实现:

技术图片

 

技术图片

 

 

技术图片

 

 

技术图片

 

技术图片

 

当此处整个获取锁的流程就结束了。上面介绍的非公平锁,那么公平锁是如何实现的呢?

公平锁的实现:

 

技术图片

 

 

技术图片

 

 

总结:一个图简单总结

 

技术图片

 

 

以上仅为个人见解,如果有错误欢迎指出。

转载请注明出处。

ReentrantLock 源码分析

标签:topic   展开   讲解   问题   模板   nod   默认值   apt   释放   

原文地址:https://www.cnblogs.com/walter-heisenberg/p/12685363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!