- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java分布式应用学习笔记06浅谈并发加锁机制分析.pdf
Java 分布式应用学习笔记 06 浅谈并发加锁机制分析
刘岩
Email:suhuanzheng7784877@163.com
Blog:
1. 前言
之前总结的多线程的调度、并发调度、线程加锁安全等等并发包底层大都使用了线程锁机
制。咱们通过锁的源码来看看 JDK 如何将这些资源进行加锁限制的,怎么就能做到线程
集中等待后就唤醒主线程的。
2. 一段并发包源码
以下是java.util.concurrent.CyclicBarrier 的底层代码片段。
private int dowait(boolean timed, long nanos)
throws InterruptedException, BrokenBarrierException,
TimeoutException {
final ReentrantLock lock = this.lock;
lock.lock();
try {
……………………省略
} finally {
lock.unlock();
在执行等待的时候,里面使用了 ReentrantLock 对其进行资源加锁,保证在代码块中使
用变量、读写变量不会被别的线程打扰。
3. 轻量级锁 ReentrantLock
基于以上程序我们就来看看 ReentrantLock 内部是如何工作的。ReentrantLock 内部有个
Sync 类,继承自 AbstractQueuedSynchronizer,基于Sync 又有 2 个子类继承于它,而
ReentrantLock 就是依靠这 2 个 Sync 子类为内核实现的。代码大家直接看 JDK 源程序即
可。
ReentrantLock 的 lock()方法,它的加锁方法实际上是使用的内部静态类 Sync 的方法,
至于调用的是公平——FairSync 还是不公平的——NonfairSync ,这个要看构建
ReentrantLock 的时候的构造函数了。
NonfairSync 的加锁方法实现流程是这样的:首先基于CAS——Compare and Swap 原则,
先将 state从 0 尝试变成 1。如果设置成功了,证明了一个事实——此时此刻,没有其他
的线程持有该锁。则当前线程设置为ExclusiveOwnerThread (独家拥有线程);那么如
果状态变量 state 设置不成功呢,则又揭示了一个事实,当前线程锁已经被其他线程所
持有,那么调用 acquire 方法,该方法首先先尝试再次获取状态 state,如果为0 了,
那么继续尝试设置状态为 1。若成功则与此时无其他线程持有锁操作雷同。如果state 依
然不为 0,则判断当前线程是否为独家拥有线程变量——exclusiveOwnerThread,是的
话将 state 的值+1.如果不是,则将当前线程放入等待队列中挂起,挂起方法
public static void park(Object blocker) {
1 / 3
Thread t = Thread.currentThread();
setBlocker(t, blocker);
unsafe.park(false, 0L);
setBlocker(t, null);
FairSync 的 lock()方法和NonfairSync 大同小异。只不过它没有获取 state变量信息的
过程,直接是调用 acquire(1)方法请求线程锁。
ReentrantLock 的unlock()方法,解锁的方法比较简单,不区分公平与不公平,都是获
取当前 state值,之后减去释放锁的个数,减操作后结果如果为 0, 示锁可以释放了。
您可能关注的文档
最近下载
- 《饮用水源保护区》课件.ppt VIP
- 《宪法基本知识课件:公务员考试公基必备》.ppt VIP
- 2022年CCAA注册审核员《产品认证基础》试题(网友回忆版).docx VIP
- 证明某人是某个公司的实际控制人的协议书6篇.docx VIP
- 2025-2026新人教版小学3三年级数学上册全册教案【新教材】.doc
- 精品解析:天津市河西区2024-2025学年八年级下学期期末数学试卷(解析版).docx VIP
- 慢性病管理系统技术要求.docx VIP
- PaperCut 安装说明.pdf VIP
- API 686-2009(美国石油协会)机械设备安装以及安装设计建议的惯例讲解.ppt
- 3.宠物医院人力资源管理《宠物医院实务》教学课件.pptx VIP
文档评论(0)