AQS.acquireQueued
这个方法前面已经完整分析过了,我们只关注一下ThreadB被唤醒以后的执行流程。
由于ThreadB的prev节点指向的是head,并且ThreadA已经释放了锁。所以这个时候调用tryAcquire方法时,可以顺利获取到锁
1. 把ThreadB节点当成head
2. 把原head节点的next节点指向为null
final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { boolean interrupted = false; for (;;) { final Node p = node.predecessor(); if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC failed = false; return interrupted; } if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } finally { if (failed) cancelAcquire(node);}
}
图解分析
1. 设置新head节点的prev=null
2. 设置原head节点的next节点为null
AQS.acquireQueued相关推荐
- 源码|并发一枝花之ReentrantLock与AQS(3):Condition
ReentrantLock#lock().ReentrantLock#unlock().ReentrantLock#lockInterruptibly()的分析见前文: 源码|并发一枝花之Reentr ...
- 源码|并发一枝花之ReentrantLock与AQS(2):lockInterruptibly
上次分析了ReentrantLock#lock()与ReentrantLock#unlock()的实现原理,并初步讨论了AQS的等待队列模型,参考源码|并发一枝花之ReentrantLock与AQS( ...
- java aqs源码_Java-AQS源码详解(细节很多!)
ReentrantLock调用lock()时时序图: addWaiter方法: enq方法:自旋 它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用 ...
- JUC AQS ReentrantLock源码分析
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还 ...
- Java并发同步器AQS
AQS是AbstractQueuedSynchronizer的简写,中文名应该叫抽象队列同步器(我给的名字,哈哈),出生于Java 1.5. 一.什么是同步器 多线程并发的执行,之间通过某种 共享 状 ...
- 扔掉源码,15张图带你彻底理解java AQS
java中AQS是AbstractQueuedSynchronizer类,AQS依赖FIFO队列来提供一个框架,这个框架用于实现锁以及锁相关的同步器,比如信号量.事件等. 在AQS中,主要有两部分功能 ...
- 源码级深挖AQS队列同步器
我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...
- Java高并发编程基础之AQS
引言 曾经有一道比较比较经典的面试题"你能够说说java的并发包下面有哪些常见的类?"大多数人应该都可以说出 CountDownLatch.CyclicBarrier.Sempah ...
- 1.5w字,30图带你彻底掌握 AQS!
前言 AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信.协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLoc ...
最新文章
- 面试5家公司,我发现这80道面试题最好用,直中要害
- 团队作业4——第一次项目冲刺(Alpha版本)-第一篇
- c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
- 小程序开发(1)-之目录结构和文件说明
- 更改oracle背景,Oracle 11gR2修改用户后导致系统HANG住
- 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)
- 系统地址和服务器地址不一致,在打开远程通服务配置程序时检测系统配置时提示配置失败,映射的ip地址与服务器不一致。...
- struts中获取多选按钮html:checkbox的值
- 【BAT】中文数字to阿拉伯数字转换
- 如何查看文件是否为csv格式_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据...
- sqlserver基本增删查语句
- Wine 开发者指导/架构概览
- FireFly编辑器调用C语言,grasshopper的插件FireFly 萤火虫
- E1630加工散热孔:中兴路由器wifi6千兆E1630电信商企版Wi-Fi6路由器3000M全千兆
- 芯片测试需要掌握什么软件,芯片测试工程师岗位职责
- CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7
- 2021年了!!Xftp新手的下载和安装教程(超详细),以及演示了远程登录和远程文件传输
- 上海市大学生CTF(华东杯CTF) Crypto 全解
- hibernate中 one to many和many to one的非主键关联
- [翻译]位运算暗黑魔导书
热门文章
- 虚拟机添加串口设备方法
- 现在java就业前景怎么样?现在入行晚了吗
- ActiveMQ持久化到mysql
- centos7防火墙操作
- 关于restful协议很多人的误解
- (转)微服务_创建一个简单的Eureka注册中心
- 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...
- yum源安装php报错缺少libmcrypt.so.4()(64bit)库
- 简单的实现图片预览, 通过原生ajax以及 jQuery两种方法实现图片预览,有更好的办法可以留言喔...................
- Unity中Oculus分屏相机和普通相机一键切换