并发编程(六)ReentrantLock

简介: 并发编程(六)ReentrantLock

Java并发编程核心在于java.concurrent.util包

而juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQS,AQS定义了一套多线程访问共享资源的同步器框架,是一个依赖状态(state)的同步器。

AQS具备特性

  • 阻塞等待队列
  • 共享/独占
  • 公平/非公平
  • 可重入
  • 允许中断

ReentrantLock

ReentrantLock定义了一个内部类Sync继承了AQS,通过这种方式将同步器所有调用都映射到Sync对应的方法,同时ReentrantLock也具备AQS的特性。ReentrantLock具备以下特性

  • 阻塞等待队列
  • 独占
  • 公平/非公平
  • 可重入
  • 允许中断

ReentrantLock继承关系

ReentrantLock里面定义了三个内部类Sync、FairSync、NonfairSync,FairSync、NonfairSync表示公平锁与非公平锁,通过这两个内部类实现公平与非公平的机制,具体关系如下图:

Lock.png

FairSync、NonfairSync是通过继承Sync实现的,其中FairSync加锁机制为先判断列队中是否有其它线程正在等待加锁,如果有则直接入队,没有才会尝试加锁;而NonfairSync加锁机制为先进行尝试加锁,加锁失败才进行入队。

除此之外,ReentrantLock还可通过lockInterruptibly()加锁时可使用Thread.interrupt()进行中断加锁过程。

ReentrantLock加锁过程(简述)

ReentrantLock加锁详细过程

公平锁加锁过程

  1. 查看队列中是否有其它线程等待加锁
  2. 队列为空或者等待加锁的线程为当前线程,尝试CAS加锁
  3. 加锁成功 state+1,结束
  4. 加锁失败(只发生在队列为空的情况),或者队列不为空且等待加锁的线程非当前线程,进行入队。
  5. 入队完毕,将前驱结点信号量(waitStatus)改为-1,阻塞等待LockSupport.park(this)

解锁过程

  1. 解锁state-1
  2. 判断state==0(可重入锁,每次加锁state都会+1,释放锁次数必须等于加锁次数才算已解锁)
  3. 判断队列中是否有等待加锁的线程
  4. 将线程唤醒LockSupport.unpark(thread)

ReentrantLock与synchronized比较

  1. 加锁机制比较
  • ReentrantLock,基于AQS实现的锁,需要手动加锁解锁,细粒度和灵活度更高
  • synchronized是JVM内部锁,JVM会自动加锁与解锁
  1. 底层原理比较
  • 都是依赖底层操作系统的Mutex lock(互斥锁)实现
  1. 锁类型比较
  • synchronized是一种可重入的非公平锁
  • ReentrantLock是基于AQS实现,具体特性上文已有说明
  1. 性能比较(未实测)
  • 在并发量小时,synchronized性能更高一些
  • 并发量高时,synchronized性能将会下降(升级为重量级锁),而ReentrantLock基本不变。

我这里的理解是,synchronized和ReentrantLock底层阻塞原理虽然是一样的,而ReentrantLock利用CAS自旋操作实现锁,能够有效避免线程从用户态到内核态的频繁切换。

目录
相关文章
|
SQL 分布式计算 大数据
大数据Spark框架概述
大数据Spark框架概述
1061 0
|
前端开发
【前端图表】echarts散点图鼠标划过散点显示信息
【前端图表】echarts散点图鼠标划过散点显示信息
435 0
|
存储 Shell 持续交付
最全总结,GitHub Action自动化部署
GitHub Actions使你可以直接在你的GitHub库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建、测试、打包、发布、部署等等,也就是说你可以直接进行 CI(持续集成)和 CD(持续部署)。 简单地说,就是利用官方以及第三方提供的actions,组合action来实现一些你能做到的其他事情,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。
1438 0
最全总结,GitHub Action自动化部署
|
3月前
|
人工智能 运维 安全
云原生 - AI Native 多智能体数字人架构实践
我们以云原生应用部门为试验田,用商业化产品 AgentTeams 落地一支"数字员工小分队",让它们承接日常研发、工单答疑、开源维护与运营等业务,把原本人肉串联的协作流程,做成 AI Native 的工作方式。
536 0
|
存储 SQL 分布式计算
大数据之路:阿里巴巴大数据实践——元数据与计算管理
本内容系统讲解了大数据体系中的元数据管理与计算优化。元数据部分涵盖技术、业务与管理元数据的分类及平台工具,并介绍血缘捕获、智能推荐与冷热分级等技术创新。元数据应用于数据标签、门户管理与建模分析。计算管理方面,深入探讨资源调度失衡、数据倾斜、小文件及长尾任务等问题,提出HBO与CBO优化策略及任务治理方案,全面提升资源利用率与任务执行效率。
896 0
|
8月前
|
人工智能 监控 数据可视化
给大模型“开小灶”:零代码实战专属领域微调,手把手教你打造AI专家
本文介绍如何通过“模型微调”将通用大模型打造成特定领域的专家助手,聚焦Web安全场景,借助LLaMA Factory实现零代码、可视化微调。涵盖微调原理(如LoRA、量化)、全流程操作及效果评估,帮助用户低成本构建专属高性能AI模型。
876 0
|
9月前
|
缓存 监控 NoSQL
阿里云NAS高并发场景下的读取延迟优化:NFS缓存机制深度解析与实战
本文解析阿里云NAS在高并发场景下NFS缓存导致的数据一致性问题,如电商图片更新延迟。深入分析客户端属性缓存机制,结合最佳实践提出三步优化:挂载参数调优、升级NFSv4.1、应用层缓存协同,并提供监控诊断方法,助力实现高性能与强一致性平衡。(238字)
|
测试技术 Android开发
抖音指定ID导入营销脚本,UID抖音号导入自动私信关注脚本,可点赞收藏作品按键精灵版
这是一款基于按键精灵开发的免ROOT抖音营销辅助插件,适用于安卓系统(测试环境为安卓16,但仍兼容更高版本)。
|
人工智能 Rust IDE
计算机相关的软硬件开发工具分类
本文系统梳理了现代开发工具图谱,涵盖软件、硬件、AI等六大领域。软件开发部分对比了传统工具(如IntelliJ IDEA、SpringBoot)与新兴工具(如AI代码助手Cursor、边缘计算框架Workers),并列出国产替代方案(华为CodeArts、阿里OpenSumi)。硬件开发突出开源EDA工具KiCad和物联网OS Zephyr。AI领域对比了TensorFlow与JAX框架,推荐本地LLM工具Ollama。文章特别设置工具选型指南,针对不同场景推荐方案,如国产化需求建议PaddlePaddle
1215 0
|
小程序
阿里云短信签名申请流程,有图,短信接入新手教程
阿里云短信签名是短信中的标识信息,如【阿里云】,用于表明发送方身份。申请流程简便:登录阿里云短信服务控制台,选择签名管理并添加签名,填写相关信息。审核通常2小时内完成。个人用户每日限申请一个通用签名,企业用户数量不限。已通过审核的签名不可更改名称,仅能调整其他信息并重新提交审核。更多详情及FAQ

热门文章

最新文章