java源码 - ReentrantLock

简介: 开篇 写完synchronized自然而然就必须分析一下java体系当中的另外一个锁ReentrantLock,相比synchronized的jvm层实现,ReentrantLock是jdk层面的实现。

开篇

 写完synchronized自然而然就必须分析一下java体系当中的另外一个锁ReentrantLock,相比synchronized的jvm层实现,ReentrantLock是jdk层面的实现。

 整个系列会分成3个部分进行讲解,分别是ReentrantLock本身的类关系,公平锁FairSync、非公平锁NonfairSync。

 之所以把ReentrantLock本身的类关系单独拿出来讲,是因为我觉得理解了ReentrantLock内部的几个类能够更加清晰理解锁的调用过程。

java源码 - ReentrantLock
java源码 - ReentrantLock之FairSync
java源码 - ReentrantLock之NonfairSync
java源码 - ReentrantLock图解加锁过程


类关系图

img_d03cfa7efdd38e5d3b4b355db76dbd4e.png
公平锁类图

说明:

  • FairSync继承自Sync,Sync继承自AbstractQueuedSynchronizer。
img_ae96c30dc5aea0e58a00147810f2d975.png
非公平锁类图

说明:

  • 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的锁动作
目录
相关文章
|
1天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
4 0
|
1天前
|
安全 Java 数据安全/隐私保护
【JAVA进阶篇教学】第十一篇:Java中ReentrantLock锁讲解
【JAVA进阶篇教学】第十一篇:Java中ReentrantLock锁讲解
|
2天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
9 0
|
2天前
|
Java 云计算
Java智能区域医院云HIS系统SaaS源码
云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和谐的基层医患关系。
16 2
|
2天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
10 3
|
3天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
21 2
|
5天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
46 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
5天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
|
6天前
|
存储 Java
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
17 2
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
|
6天前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
22 3
实现HBase表和RDB表的转化(附Java源码资源)