ReentrantLock源码(二)
一、ReentrantLock类中的方法解读。
1、lock方法。实现了接口Lock中的lock方法。这里实际上是调用了sync成员变量的lock方法来实现。所以取决于sync的实现。

2、unlock方法。实现了接口Lock中的unlock方法。这里实际上是调用了sync成员变量的release方法来实现。所以取决于sync的实现。

3、lockInterruptibly方法。实现了接口Lock中的unlock方法。这里实际上是调用了sync成员变量的acquireInterruptibly方法来实现。所以取决于sync的实现。

4、trylock方法。实现了接口Lock中的trylock方法。这里实际上是调用了sync成员变量的anonfairTryAcquire方法来实现。所以取决于sync的实现。

5、trylock重载的方法。实现了接口Lock中的trylock重载方法。这里实际上是调用了sync成员变量的tryAcquireNanos方法来实现。所以取决于sync的实现。

6、newCondition方法。实现了接口Lock中的newCondition方法。这里实际上是调用了sync成员变量的newCondition方法来实现。所以取决于sync的实现。

7、getHoldCount方法。这里实际上是调用了sync成员变量的getHoldCount方法来实现。所以取决于sync的实现。

8、isHeldByCurrentThread方法。这里实际上是调用了sync成员变量的isHeldByCurrentThread方法来实现。所以取决于sync的实现。

9、isLocked方法。这里实际上是调用了sync成员变量的isLocked方法来实现。所以取决于sync的实现。

10、isFair方法。判断该ReentrantLock对象中sync成员是不是内部类FairSync的实例。

11、hasQueuedThreads方法。这里实际上是调用了sync成员变量的hasQueuedThreads方法来实现。所以取决于sync的实现。

12、hasQueuedThread方法。这里实际上是调用了sync成员变量的hasQueuedThread方法来实现。所以取决于sync的实现。

13、hasWaiters方法。这里实际上是调用了sync成员变量的hasWaiters方法来实现。所以取决于sync的实现。

14、getOwner方法。这里实际上是调用了sync成员变量的getOwner方法来实现。所以取决于sync的实现。

15、getQueuedThreads方法。这里实际上是调用了sync成员变量的getQueuedThreads方法来实现。所以取决于sync的实现。

16、getWaitingThreads方法。这里实际上是调用了sync成员变量的getWaitingThreads方法来实现。所以取决于sync的实现。

17、getQueueLength方法。这里实际上是调用了sync成员变量的getQueueLength方法来实现。所以取决于sync的实现。

18、getWaitQueueLength方法。这里实际上是调用了sync成员变量的getWaitQueueLength方法来实现。所以取决于sync的实现。

19、toString方法。这里实际上是调用了sync成员变量的getOwner方法来实现。所以取决于sync的实现。打印出线程名称/null。

#################################################################################
由于ReentrantLock类的成员变量sync是抽象类,因此里面的方法取决于运行时动态指定的,这里,他有两个实现类,一个是FairSync类,一个是NonFairSync类。仔细一看,两个类里面都只有两个成员方法。显然,这两个方法在两个类中实现是不同的,不然干嘛分两个类呢。而ReentrantLock类中大部分方法都是调用sync,因此大部分方法应该在Sync类和Sync的继承类AbstractQueuedSynchronizer中。

###############################################################################
二、NonFairSync类中的方法。
0、方法目录。

1、lock方法。实现了Sync类中的方法。

2、tryAcquire方法。实现了父类Sync的父类AQS的方法。实际上调用的是Sync类中的nonfairTryAcquires方法。

三、FairSync类中的方法。
0、方法目录。

1、lock方法。

2、tryAcquire方法。实现了父类Sync的父类AQS的方法。

3、
四、Sync类中的方法。
0、方法目录。

1、lock方法。抽象方法,交给实现类来实现。

2、nonfairTryAcquires方法。

3、tryRelease方法。

4、isHeldExclusively方法。

5、newCondition方法。这里直接使用了父类的内部类。

6、getOwner方法。

7、getHoldCount方法。

8、isLocked方法。

9、readObject方法。

10、
五、AbstractQueuedSynchronizer类中的方法。
-1、成员变量目录。


0、方法目录。



1、acquire方法。

2、getState方法。

3、setState方法。

4、compareAndSetState方法。

5、compareAndSetHead方法。

6、compareAndSetTail方法。

7、 compareAndSetWaitStatus方法。

8、compareAndSetNext方法。

9、acquireInterruptibly方法。

10、tryAcquireNanos方法。

11、addWaiter方法。

12、acquireQueued方法。

13、tryAcquire方法。该实现就是抛出异常,因此,如果子类不重写该方法,那么直接调用该方法就会抛出异常。

14、setInterrupt方法。

15、doAcquireInterruptibly方法。

16、enq方法。

17、setHead方法。

18、setHeadAndPropagate方法。

19、tryAcquireNanos方法。

20、doAcquireNanos方法。


21、release方法。

22、tryRelease方法。

23、unparkSuccessor方法。

24、acquireShared方法。

25、tryAcquireShared方法。

26、doAcquireShared方法。


27、acquireSharedInterruptibly方法。

28、doAcquireSharedInterruptibly方法。


29、tryAcquireShareNanos方法。

30、doAcquireSharedNanos方法。


31、releaseShared方法。

32、 tryReleaseShared方法

33、doReleaseShared方法。


34、hasQueuedThreads方法。

35、hasContended方法。

36、isQueued方法。

37、hasQueuedPredecessors方法。

38、getQueueLength方法。

39、getQueuedThreads方法。

40、getExclusiveQueuedThreads方法。

41、owns方法。

42、hasWaiters方法。

43、getWaitQueueLength方法。

44、getWaitingThreads方法。

45、isHeldExclusively方法。

46、apparentlyFirstQueuedIsExclusive方法。

47、isOnSyncQueue方法。

48、findNodeFromTail方法。

49、tansferForSignal方法。

50、transferAfterCancelledWait方法。

51、fullRelease方法。

52、setHead方法。

53、unparkSuccessor方法。

54、setHeadAndProgagate方法。

55、cancelAcquire方法。


56、


57、parkAndCheckInterrupt方法。

58、
六、
1、
2、
3、
4、
5、
ReentrantLock源码(二)的更多相关文章
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
- Java并发之ReentrantLock源码解析(二)
在了解如何加锁时候,我们再来了解如何解锁.可重入互斥锁ReentrantLock的解锁方法unlock()并不区分是公平锁还是非公平锁,Sync类并没有实现release(int arg)方法,这里会 ...
- 并发编程(五)——AbstractQueuedSynchronizer 之 ReentrantLock源码分析
本文将从 ReentrantLock 的公平锁源码出发,分析下 AbstractQueuedSynchronizer 这个类是怎么工作的,希望能给大家提供一些简单的帮助. AQS 结构 先来看看 AQ ...
- Java并发编程-ReentrantLock源码分析
一.前言 在分析了 AbstractQueuedSynchronier 源码后,接着分析ReentrantLock源码,其实在 AbstractQueuedSynchronizer 的分析中,已经提到 ...
- JUC AQS ReentrantLock源码分析
警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. Java的内置锁一直都是备受争议的,在JDK1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6 ...
- 多线程高并发编程(3) -- ReentrantLock源码分析AQS
背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...
- AQS源码二探-JUC系列
本文已在公众号上发布,感谢关注,期待和你交流. AQS源码二探-JUC系列 共享模式 doAcquireShared 这个方法是共享模式下获取资源失败,执行入队和等待操作,等待的线程在被唤醒后也在这个 ...
- Java并发系列[5]----ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Java并发编程笔记之ReentrantLock源码分析
ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞后放入该锁的AQS阻塞队列里面. 首先我们先看一下ReentrantLock的类图结构,如下图所示 ...
随机推荐
- spark Pair RDD 基础操作
下面是Pair RDD的API讲解 转化操作 reduceByKey:合并具有相同键的值: groupByKey:对具有相同键的值进行分组: keys:返回一个仅包含键值的RDD: values:返回 ...
- 封装一个axios请求后台的通用方法
import axios from 'axios'; import constant from '@/js/const'; import alert from '@/js/alertView'; le ...
- CF1103D Professional layer dp
正解:dp 解题报告: 传送门! 首先不难想到求个gcd,然后把gcd质因数分解成p1w1*p2w2*p3w3*...*pmwm 显然只要满足对每个p有一个ai%pj!=0就好,也就是说对每个pj找出 ...
- 【PyQt5-Qt Designer】按钮系列
[PyQt5-Qt Designer]按钮系列 复选框(QCheckBox) 效果如下: 参考: https://zhuanlan.zhihu.com/p/30509947 完整代码: from Py ...
- Webpack傻瓜式指南(转)
add by zhj: 作者写了三篇文章,这是第一篇幅,另外两篇参见 https://zhuanlan.zhihu.com/p/20397902 https://zhuanlan.zhihu.com/ ...
- redis 的消息队列 VS kafka
redis push/pop VS pub/sub (1)push/pop每条消息只会有一个消费者消费,而pub/sub可以有多个 对于任务队列来说,push/pop足够,但真的在做分布式消息分发的时 ...
- SQL Server2008及以上 表分区操作详解
SQL Server 表分区之水平表分区 转自:https://www.cnblogs.com/Brambling/p/6766482.html 什么是表分区? 表分区分为水平表分区和垂直表分区,水 ...
- Cookie和Session的区别?
1.Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端. 2.Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session ...
- GitHub账户注册
GitHub是一个优秀的面向开源及私有软件项目的托管平台,值得我们使用,但因为其不同于我们常见的很多平台,所以刚开始使用时,我们会遇到很多的问题.特此记录下博主自己使用GitHub的过程供自己以后查看 ...
- tf实现LSTM时rnn.DropoutWrapper
转自:https://blog.csdn.net/abclhq2005/article/details/78683656 作者:abclhq2005 1.概念介绍 所谓dropout,就是指网络中每个 ...