java底层组合AQS实现类kReentrantLock源码分析


这篇“java底层组合AQS实现类kReentrantLock源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收免费云主机域名获,下面我们一起来看看这篇“java底层组合AQS实现类kReentrantLock源码分析”文章吧。ReentrantLock 中文我们习惯叫做可重入互斥锁,可重入的意思是同一个线程可以对同一个共享资源重复的加锁或释放锁,互斥就是 AQS 中的排它锁的意思,只允许一个线程获得锁。我们来一起来看下类注释上都有哪些重要信息:我们补充一下第二点,ReentrantLock 的公平和非公平,是针对获得锁来说的,如果是公平的,可以保证同步队列中的线程从头到尾的顺序依次获得锁,非公平的就无法保证,在释放锁的过程中,我们是没有公平和非公平的说法的。ReentrantLock 类本身是不继承 AQS 的,实现了 Lock 接口,如下:Lock 接口定义了各种加锁,释放锁的方法,接口有如下几个:ReentrantLock 就负责实现这些接口,我们使用时,直接面对的也是这些方法,这些方法的底层实现都是交给 Sync 内部类去实现的,Sync 类的定义如下:Sync 继承了 AbstractQueuedSynchronizer ,所以 Sync 就具有了锁的框架,根据 AQS 的框架,Sync 只需要实现 AQS 预留的几个方法即可,但 Sync 也只是实现了部分方法,还有一些交给子类 NonfairSync 和 FairSync 去实现了,NonfairSync 是非公平锁,FairSync 是公平锁,定义如下:几个类整体的结构如下:图中 Sync、NonfairSync、FairSync 都是静态内部类的方式实现的,这个也符合 AQS 框架定义的实现标准。ReentrantLock 构造器有两种,代码如下:无参构造器默认构造是非公平的锁,有参构造器可以选择。从构造器中可以看出,公平锁是依靠 FairSync 实现的,非公平锁是依靠 NonfairSync 实现的。Sync 表示同步器,继承了 AQS,UML 图如下:从 UML 图中可以看出,lock 方法是个抽象方法,留给 FairSync 和 NonfairSync 两个子类去实现,我们一起来看下剩余重要的几个方法。以上代码有三点需要注意:无参的 tryLock 方法调用的就是此方法,tryLock 的方法源码如下:tryRelease 方法是公平锁和非公平锁都公用的,在锁释放的时候,是没有公平和非公平的说法的。从代码中可以看到,锁最终被释放的标椎是 state 的状态为 0,在重入加锁的情况下,需要重入解锁相应的次数后,才能最终把锁释放,比如线程 A 对共享资源 B 重入加锁 5 次,那么释放锁的话,也需要释放 5 次之后,才算真正的释放该共享资源了。FairSync 公平锁只实现了 lock 和 tryAcquire 两个方法,lock 方法非常简单,如下:tryAcquire 方法是 AQS 在 acquire 方法中留给子类实现的抽象方法,FairSync 中实现的源码如下:代码和 Sync 的 nonfairTryAcquire 方法实现类似,唯一不同的是在获得锁时使用 hasQueuedPredecessors 方法体现了其公平性。NonfairSync 底层实现了 lock 和 tryAcquire 两个方法,如下:以上内容主要说了 ReentrantLock 的基本结构,比较零散,那么这些零散的结构如何串联起来呢?我们是通过 lock、tryLock、unlock 这三个 API 将以上几个类串联起来,我们来一一看下。lock 的代码实现:其底层的调用关系(只是简单表明调用关系,并不是完整分支图)如下:tryLock 有两个方法,一种是无参的,一种提供了超时时间的入参,两种内部是不同的实现机制,代码分别如下:接着我们一起看下两个 tryLock 的调用关系图,下图显示的是无参 tryLock 的调用关系图,如下:我们需要注意的是 tryLock 无参方法底层走的就是非公平锁实现,没有公平锁的实现。下图展示的是带有超时时间的有参 tryLock 的调用实现图:unlock 释放锁的方法,底层调用的是 Sync 同步器的 release 方法,release 是 AQS 的方法,分成两步:第一步就是我们上文中 Sync 的 tryRelease 方法(4.1),第二步 AQS 已经实现了。unLock 的源码如下:ReentrantLock 对 Condition 并没有改造,直接使用 AQS 的 ConditionObject 即可。以上就是关于“java底层组合AQS实现类kReentrantLock源码分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: CSS3多栏布局、盒布局和弹性盒布局怎么实现

本篇内容介绍了“CSS3多栏布局、盒布局和弹性盒布局怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   1多栏布局   使用多栏布局可以将一个元素中的内…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 01/23 15:17
Next 01/23 15:17

相关推荐