Java并发之ReentrantLock类源码解析
ReentrantLock内部由Sync类实例实现。
Sync类定义于ReentrantLock内部。
Sync继承于AbstractQueuedSynchronizer。
AbstractQueuedSynchronizer继承于AbstractOwnableSynchronizer。
AbstractOwnableSynchronizer类中只定义了一个exclusiveOwnerThread变量,表示当前拥有的线程。
除了Sync类,ReentrantLock内部还定义了两个实现类。
NonfairSync是非公平锁。FairSync 是公平锁。
ReentrantLock两个构造方法如下:
ReentrantLock的lock方法
非公平锁的lock方法
compareAndSetState方法是一个CAS方法。该方法尝试去更新对象内的一个变量。变量期望是0,更新为1。
若更新成功,则将exclusiveOwnerThread变量设置为当前线程。然后lock方法会立刻返回。
若更新不成功,则调用acquire(1)。
acquire方法中首先调用tryAcquire()再次尝试更新。
非公平锁的tryAcquire()方法如下:
非公平锁的tryAcquire()方法内部调用nonfairTryAcquire方法如下:
若tryAcquire()方法再次尝试不成功。则首先会调用addWaiter()方法,将当前线程加入等待队列。addWaiter方法返回一个Node节点。
返回节点后,acquireQueued(node,1)会再次尝试去做更新。
若还是无法更新,则通过parkAndCheckInterrupt将线程挂起。
ReentrantLock的unlock方法
查看release()方法。
若队列的head不为空,且head的等待状态不为0,则调用unparkSuccessor()方法。
unparkSuccessor()方法如下:
使node的next从后向前遍历,获取到队列中最前面的一个waitStatus小于0的线程。然后将节点上的线程继续执行。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 使用pm2管理go应用进程
- 用Docker搭建Redis主从复制的集群
- IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
- ArrayList源码分析(基于jdk1.8)(二):subList陷阱补充
- Windows10中安装Docker
- Windows下Docker安装ClickHouse
- ArrayList源码分析(基于jdk1.8)(三):Arrays.asList方法带来的问题
- 对基本类型包装类常量池的补充
- 与IntegerCache有关的一个比较坑的面试题
- C# Foreach循环本质与枚举器
- Java中的时间和日期(一):有关java时间的哪些坑
- Java中的时间和日期(二):java时间存储的基本原理
- 常用SQL语句
- Java中的时间和日期(三):java8中新的时间API介绍
- Java中的时间和日期(四):与java8时间API有关的一些总结和补充