java源码 - ReentrantLock
开篇
写完synchronized自然而然就必须分析一下java体系当中的另外一个锁ReentrantLock,相比synchronized的jvm层实现,ReentrantLock是jdk层面的实现。
整个系列会分成3个部分进行讲解,分别是ReentrantLock本身的类关系,公平锁FairSync、非公平锁NonfairSync。
之所以把ReentrantLock本身的类关系单独拿出来讲,是因为我觉得理解了ReentrantLock内部的几个类能够更加清晰理解锁的调用过程。
java源码 - ReentrantLock
java源码 - ReentrantLock之FairSync
java源码 - ReentrantLock之NonfairSync
java源码 - ReentrantLock图解加锁过程
类关系图
说明:
- FairSync继承自Sync,Sync继承自AbstractQueuedSynchronizer。
说明:
- NonfairSync继承自Sync,Sync继承自AbstractQueuedSynchronizer。
源码层面分析
从源码可以看出几个比较重要的点:
- Sync继承自AbstractQueuedSynchronizer
- NonfairSync和FairSync继承自Sync
- ReentrantLock的变量sync保存NonfairSync和FairSync,都继承自Sync。
- ReentrantLock的构造函数创建NonfairSync和FairSync对象赋值给sync
- ReentrantLock的lock()和unlock()调用的是sync的lock()和unlock()方法
public class ReentrantLock implements Lock, java.io.Serializable { // 保存公平锁对象或者非公平锁对象 private final Sync sync; // 抽象类Sync abstract static class Sync extends AbstractQueuedSynchronizer { abstract void lock(); // 省略相关代码 } // 非公平锁对象 static final class NonfairSync extends Sync { final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } protected final boolean tryAcquire(int acquires) { // 省略相关代码 } } // 公平锁对象 static final class FairSync extends Sync { private static final long serialVersionUID = -3000897897090466540L; final void lock() { acquire(1); } protected final boolean tryAcquire(int acquires) { // 省略相关代码 } public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } public void lock() { sync.lock(); } public void unlock() { sync.release(1); }
总结
这篇文章的主要目的其实就是为了讲清楚一个问题,总结如下:
- ReentrantLock的锁内部实现通过NonfairSync和FairSync实现
- NonfairSync和FairSync继承Sync类,通过Sync对象保存NonfairSync和FairSync对象
- ReentrantLock的锁动作其实就是NonfairSync和FairSync的锁动作

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
react native 友盟统计 Android 端集成
ios 端 可参考:https://www.jianshu.com/p/879d28ee74e6 趁热打铁吧,把刚才已经完成的友盟统计集成记录下 Android端集成: 分下面几部: 步骤 sdk的集成 原生模块的配置 原生交互模块 RN端调用 sdk集成部分 友盟sdk下载地址:https://developer.umeng.com/sdk?spm=a211g2.211692.0.0.4cc21183f5dYjU sdk集成相关文档:https://developer.umeng.com/docs/66632/detail/68337 这里如果嫌官方文档太乱的话可以参考下 我这里的手动集成: 1.首先把 下载的sdk umeng-analytics-7.5.3.jar umeng-common-1.5.3.jar 放到工程目录下的libs文件夹下,thirdparties文件下的可能和混淆加密有关,这里按需使用吧,我这里没有。 image.png image.png 把架包添加到工程中 image.png dependencies { compile files('libs/umen...
- 下一篇
【译Py】2018年8月,GitHub上的Python数据科学明星项目:自动化机器学习、自然语言处理、可视化、机器学习工作流
原文作者:Matthew Mayo 原文地址:GitHub Python Data Science Spotlight: AutoML, NLP, Visualization, ML Workflows Python数据分析 本文是“五个不容忽视的机器学习项目”一文的续篇。和上篇文章相比,这次选出的项目涉及更多数据科学领域,并且都是GitHub上的开源项目,我们为每个项目都附上了Repo、文档和入门指南的链接,并对每个项目进行了简单介绍。 下面一起来了解一下这些新兴的热门Python库吧,希望本文对你的工作能有所帮助: Auto-Keras自动机器学习库 项目链接:https://github.com/jhfjhfj1/autokeras 文档:http://autokeras.com 入门指南:https://autokeras.com/#example Auto-Keras是用于自动机器学习(AutoML)的开源软件库。自动机器学习的最终目标是让仅拥有一定数据科学知识或机器学习背景的行业专家可以轻松地应用深度学习模型。Auto-Keras提供了很多用于自动研究深度学习模型架构与超参...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19