学习JUC源码(2)——自定义同步组件
前言
在之前的博文(学习JUC源码(1)——AQS同步队列(源码分析结合图文理解))中,已经介绍了AQS同步队列的相关原理与概念,这里为了再加深理解ReentranLock等源码,模仿构造同步组件的基本模式,编写不可重入的互斥锁Mutex与指定共享线程数量的共享锁。MySharedLock。
主要参考资料《Java并发编程艺术》(有需要的小伙伴可以找我,我这里只有电子PDF)同时结合ReentranLock、AQS等源码。
一、构造同步组件的模式
丛概念方层面,在中,我们知道锁与同步器的相关概念:
- 同步器是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义;
- 锁是面向使用者的,提供锁交互的实现;
- 同步器是面向锁的实现者,简化了锁的实现方式,屏蔽了同步状态管理、线程排队、等待/唤醒等底层操作。
从代码层面,同步器是基于模板模式实现的,可以通过可重写的方法中的随便一个窥探:
也就是需要进行以下几步:
1)继承同步器重写指定方法(idea中extends AQS点击快捷键ctrl+O即可显示)
- tryAcquire(int arg):独占式获取同步状态;
- tryRelease(int arg):独占式释放同步状态;
- tryAcquireShared(int arg):共享式获取同步状态,返回大于0的值表示获取成功,否则失败
- tryReleaseShared(int arg):共享式释放锁
- isHeldExclusively():当前线程是否在独占模式下被线程占用,一般该方法表示是否被当前线程占用
2)随后将同步器组合在自定义同步组件的实现中,即定义内部类Syn继承AQS,在Syn中重写AQS方法:
3)最后调用同步器提供的模板方法,即同步组件类实现Lock方法之后,在lock/unlock方法中调用内部类Syn的方法acquire(int arg)等方法
具体请看下面的实践部分
二、互斥不可重入锁
在我之前写过的博文中(详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码))介绍可重入锁与不可重入锁的区别时,就写到JUC中没有不可重入锁的具体实现,但是可以类比,现在呢,我们可以做到实现了,具体看下面代码,模式完全符合依赖Lock与AQS构造同步组件模式。
(1)Mutex代码实现(核心关键实现已经在代码中注释)
其中核心代码就是重写的两个方法:
- tryAcquire(int arg)方法:主要是设置同独占式更新同步状态,CAS实现state+1
- tryRelease(int arg)方法:独占式释放同步状态,释放锁持有
(2)测试Demo
(3)运行结果
(4)结果分析
互斥锁的核心就是同一个同步状态只能被一个线程持有,其它线程等待持有线程释放才能竞争获取。截图一开始的运行结果分析:
10个线程不断竞争锁,一开始Thread-0在08 16:26:42获取到锁,持有锁1秒后在释放16:26:43时释放,同时Thread-1立马获取到锁,1秒后于16:26:44释放锁,同时Thread-2立马获取到了锁......
根据输出结果来说,完全符合Mutex作为互斥锁这个功能:同一时刻只有一个线程持有锁(同步状态),其它线程等待释放后才能获取。
三、指定共享线程数目的共享锁
(1)代码实现(核心关键实现已经在代码中注释)
(2)测试Demo
(3)运行结果(结果可能不同)
(4)结果分析
该指定共享线程数量N的共享锁的最终目的就是多个线程可以持有锁(同步状态),达到共享线程数量N(代码中默认为2)时,其它线程将进入Queue等待获取同步结果,同一时刻只能最多有N个线程持有锁。
同样地,我们分析开头运行结果:
10个线程不停竞争锁,一开始Thread-0与Thread-1在16:36:05时刻同时获取到了锁,此时已经达到共享数量的最大值,即N,之后持有锁1秒,Thread-0与Thread-1在16:36:06时刻立马释放锁,同时Thread-4与Thread-2立马退出等待队列立马竞争持有锁。
从结果来看,完全是符合ShareLock共享锁功能的:同一时刻最多允许N个线程持有锁,其它线程等待持有线程释放锁!
__EOF__

本文链接:https://www.cnblogs.com/jian0110/p/14102810.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix