以ReentrantLock作为切入点,来看看在这个场景中是如何使用AQS来实现线程的同步的

ReentrantLock的时序图

调用ReentrantLock中的lock()方法,源码的调用过程我使用了时序图来展现。

ReentrantLock.lock()

这个是reentrantLock获取锁的入口

public void lock() { sync.lock();
} 

sync实际上是一个抽象的静态内部类,它继承了AQS来实现重入锁的逻辑,我们前面说过AQS是一个同步队列,它能够实现线程的阻塞以及唤醒,但它并不具备业务功能,所以在不同的同步场景中,会继承AQS来实现对应场景的功能

Sync有两个具体的实现类,分别是:

NofairSync:表示可以存在抢占锁的功能,也就是说不管当前队列上是否存在其他线程等待,新线程都有机会抢占锁

FailSync: 表示所有线程严格按照FIFO来获取锁

NofairSync.lock

以非公平锁为例,来看看lock中的实现

1. 非公平锁和公平锁最大的区别在于,在非公平锁中我抢占锁的逻辑是,不管有没有线程排队,我先上来cas去抢占一下

2. CAS成功,就表示成功获得了锁

3. CAS失败,调用acquire(1)走锁竞争逻辑

final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1);
}

R eentrantLock的源码分析相关推荐

  1. hashmap源码分析及常用方法测试_一点课堂(多岸学院)

    HashMap 简介 底层数据结构分析 JDK1.8之前 JDK1.8之后 HashMap源码分析 构造方法 put方法 get方法 resize方法 HashMap常用方法测试 感谢 changfu ...

  2. NFC源码分析之R/W工作模式

    文章整理总结java层,NFC读取和写入Tag的流程. 整体的时序图: 1.读取Tag的流程 NfcService启动完成后,会通过NfcService中的applyRouting方法设置对应的Dis ...

  3. 【安卓 R 源码】 bindService 源码分析

    使用bindService主要分两种情形: 1. Service的调用者client与Service在同一个App中: 2. Service的调用者client是App1中的一个Activity,而S ...

  4. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  5. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...

  6. s-sgdisk源码分析 “--set-alignment=value分区对齐参数”

    文章目录 边界对齐子命令使用 源码分析 sgdisk.cc main函数入口 gptcl.cc DoOptions解析并执行具体命令函数 gpt.cc CreatePartition创建分区函数,设置 ...

  7. Google Mock(Gmock)简单使用和源码分析——源码分析

    源码分析 通过<Google Mock(Gmock)简单使用和源码分析--简单使用>中的例子,我们发现被mock的相关方法在mock类中已经被重新实现了,否则它们也不会按照我们的期待的行为 ...

  8. EOS智能合约:system系统合约源码分析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. ...

  9. kazoo源码分析:服务器交互的实现细节

    kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...

最新文章

  1. 学习笔记-express路径问题
  2. [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题
  3. 细胞因子风暴与新冠肺炎
  4. Android上传队列使用
  5. iPhone在华智能机市场份额首次下滑
  6. 三线调速风扇原理_学修电风扇~风机转速慢、调速失灵故障维修。
  7. 小米折叠手机高清渲染图曝光:双外折叠形态美如画
  8. 获取本机IP和MAC地址
  9. UNSW-论文以及博士论文下载
  10. SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
  11. swift python 性能_Swift 性能探索和优化分析
  12. stylus vue 报错_带你玩转webpack 从零构建Vue工程
  13. Python中import的用法
  14. 支付宝相关服务申请入口
  15. 数学悖论与三次数学危机
  16. java企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  17. 加州欧文大学计算机工程,加州大学欧文分校计算机工程专业课程设置有哪些
  18. 7-1 sdust-Java-字符串集合求并集 (20 分)
  19. 强化学习笔记:强化学习的约束
  20. 快速批量压缩照片到指定大小工具,照片图片批量压缩实现方法,批量压缩工具

热门文章

  1. 结合源码分析 bubble 使用注意事项
  2. 【一个iOS官方文档错误】关于keyWindow是否可以接受触摸事件?
  3. SYBASE里面出现客户端和服务器端字符集不匹配的情况解决方法
  4. 程序员编程艺术第一~十章集锦与总结(教你如何编程)--持续更新中
  5. 在一台服务器上配置多个Tomcat的方法
  6. Retrofit2.5是如何解析在接口类中定义的请求方法?
  7. VS.NET C#视频教学
  8. python3网络爬虫(4):python3安装Scrapy
  9. 浅析Memcache和Redis
  10. Ceph分布式存储学习指南1.10 iRODS