这个方法前面已经完整分析过了,我们只关注一下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相关推荐

  1. 源码|并发一枝花之ReentrantLock与AQS(3):Condition

    ReentrantLock#lock().ReentrantLock#unlock().ReentrantLock#lockInterruptibly()的分析见前文: 源码|并发一枝花之Reentr ...

  2. 源码|并发一枝花之ReentrantLock与AQS(2):lockInterruptibly

    上次分析了ReentrantLock#lock()与ReentrantLock#unlock()的实现原理,并初步讨论了AQS的等待队列模型,参考源码|并发一枝花之ReentrantLock与AQS( ...

  3. java aqs源码_Java-AQS源码详解(细节很多!)

    ReentrantLock调用lock()时时序图: addWaiter方法: enq方法:自旋 它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用 ...

  4. JUC AQS ReentrantLock源码分析

    Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还 ...

  5. Java并发同步器AQS

    AQS是AbstractQueuedSynchronizer的简写,中文名应该叫抽象队列同步器(我给的名字,哈哈),出生于Java 1.5. 一.什么是同步器 多线程并发的执行,之间通过某种 共享 状 ...

  6. 扔掉源码,15张图带你彻底理解java AQS

    java中AQS是AbstractQueuedSynchronizer类,AQS依赖FIFO队列来提供一个框架,这个框架用于实现锁以及锁相关的同步器,比如信号量.事件等. 在AQS中,主要有两部分功能 ...

  7. 源码级深挖AQS队列同步器

    我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...

  8. Java高并发编程基础之AQS

    引言 曾经有一道比较比较经典的面试题"你能够说说java的并发包下面有哪些常见的类?"大多数人应该都可以说出 CountDownLatch.CyclicBarrier.Sempah ...

  9. 1.5w字,30图带你彻底掌握 AQS!

    前言 AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信.协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLoc ...

最新文章

  1. 面试5家公司,我发现这80道面试题最好用,直中要害
  2. 团队作业4——第一次项目冲刺(Alpha版本)-第一篇
  3. c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
  4. 小程序开发(1)-之目录结构和文件说明
  5. 更改oracle背景,Oracle 11gR2修改用户后导致系统HANG住
  6. 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)
  7. 系统地址和服务器地址不一致,在打开远程通服务配置程序时检测系统配置时提示配置失败,映射的ip地址与服务器不一致。...
  8. struts中获取多选按钮html:checkbox的值
  9. 【BAT】中文数字to阿拉伯数字转换
  10. 如何查看文件是否为csv格式_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据...
  11. sqlserver基本增删查语句
  12. Wine 开发者指导/架构概览
  13. FireFly编辑器调用C语言,grasshopper的插件FireFly 萤火虫
  14. E1630加工散热孔:中兴路由器wifi6千兆E1630电信商企版Wi-Fi6路由器3000M全千兆
  15. 芯片测试需要掌握什么软件,芯片测试工程师岗位职责
  16. CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7
  17. 2021年了!!Xftp新手的下载和安装教程(超详细),以及演示了远程登录和远程文件传输
  18. 上海市大学生CTF(华东杯CTF) Crypto 全解
  19. hibernate中 one to many和many to one的非主键关联
  20. [翻译]位运算暗黑魔导书

热门文章

  1. 虚拟机添加串口设备方法
  2. 现在java就业前景怎么样?现在入行晚了吗
  3. ActiveMQ持久化到mysql
  4. centos7防火墙操作
  5. 关于restful协议很多人的误解
  6. (转)微服务_创建一个简单的Eureka注册中心
  7. 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...
  8. yum源安装php报错缺少libmcrypt.so.4()(64bit)库
  9. 简单的实现图片预览, 通过原生ajax以及 jQuery两种方法实现图片预览,有更好的办法可以留言喔...................
  10. Unity中Oculus分屏相机和普通相机一键切换