在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能。比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。如图2-5-9-4,通过前驱后续节点的引用一节节连接起来形成一个链表队列,对于头尾节点的更新必须是原子的。下面详细看看入队、检测挂起、释放出队、超时、取消等操作。
 
图2-5-9-4 CLH队列
① 入队,整块逻辑其实是用一个无限循环进行CAS操作,即用自旋方式竞争直到成功。将尾节点tail的旧值赋予新节点node的前驱节点,并尝试CAS操作将新节点node赋予尾节点tail,原先的尾节点的后续节点指向新建节点node。完成上面步骤就建立起一条如图2-5-9-4所示的链表队列。代码简化如下:
for (;;) {
   Node t = tail;
   node.prev = t;
   if (compareAndSetTail(t, node)) {
      t.next = node;
      return node;
   }
}
② 检测挂起,上面我们说到节点等待机制已经被AQS作者由自旋机制改造成阻塞机制,一个新建的节点完成入队操作后,如果是自旋则直接进入循环检测前驱节点是否为头结点即可,但现在被改为阻塞机制,当前线程将首先检测是否为头结点且尝试获取锁,如果当前节点为头结点并成功获取锁则直接返回,当前线程不进入阻塞,否则将当前线程阻塞。代码简化如下:
 for (;;) {
    if (node.prev == head)
if(尝试获取锁成功){
         head=node;
         node.next=null;
         return;
     }
   阻塞线程
}
③ 释放出队,出队的主要工作是负责唤醒等待队列中后续节点,让所有等待节点环环相接,每条线程有序地往下执行。代码简化如下:
Node s = node.next;
唤醒节点s包含的线程
④ 超时,在支持超时的模式下需要LockSupport类的parkNanos方法支持,线程在阻塞一段时间后会自动唤醒,每次循环将累加消耗时间,当总消耗时间大于等于自定义的超时时间时就直接分返。代码简化如下:
for (;;) {
   尝试获取锁
   if (nanosTimeout <= 总消耗时间)
      return;
   LockSupport.parkNanos(this, nanosTimeout);
 }
⑤ 取消,队列中等待锁的队列可能因为中断或超时而涉及到取消操作,这种情况下被取消的节点不再进行锁竞争。此过程主要完成的工作是将取消的节点移除,先将节点的。先将节点node状态设置成取消,再将前驱节点pred的后续节点指向node的后续节点,这里由于涉及到竞争,必须通过CAS进行操作,CAS操作就算失败也不必理会,因为已经改了节点的状态,在尝试获取锁操作中会循环对节点的状态判断。
node.waitStatus = Node.CANCELLED;
Node pred = node.prev;
Node predNext = pred.next;
Node next = node.next;

compareAndSetNext(pred, predNext, next);

点击订购作者书籍《Tomcat内核设计剖析》

Java并发框架——AQS阻塞队列管理(三)——CLH锁改造相关推荐

  1. 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...

  2. Java并发编程之阻塞队列

    Java并发编程之阻塞队列 目录 阻塞队列概述 为什么用?有什么好处? BlockingQueue的核心方法 SynchronousQueue的用法 用在哪里 1. 阻塞队列概述 阻塞队列,顾名思义, ...

  3. 吃透Java并发:AQS结构详解及其CLH变种、CLH、MCS

    目录 1.前言 2.AQS的构成 2.1 状态信息state 2.2 节点信息Node 2.3 阻塞/唤醒 2.4 当前持有锁线程 2.5 头结点与尾节点 3.CLH队列 3.1 CLH锁 3.2 M ...

  4. Java并发框架——AQS之怎样使用AQS构建同步器

    AQS的设计思想是通过继承的方式提供一个模板让大家能够非常easy依据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即能够实现不同的锁机制. AQS的设计必须考 ...

  5. Java并发编程:阻塞队列

    2019独角兽企业重金招聘Python工程师标准>>> 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法 ...

  6. Java并发编程-BlockingQueue阻塞队列

    BlockingQueue阻塞队列 1.BlockingQueue介绍 1.1.引言: 1.2.阻塞队列介绍: 1.3.阻塞队列的用处: 1.4.接口架构图 2.BlockingQueue核心方法 3 ...

  7. Java并发编程-AQS源码之条件队列

    System.out.println(name + "==>成功获取到锁" + lock); try { condition.await(); } catch (Interr ...

  8. java双端队列工作密取,同步器皿、并发容器、阻塞队列、双端队列与工作密取...

    同步容器.并发容器.阻塞队列.双端队列与工作密取 在多线程的开发中经常会碰到数据的并发修改,并发存取,因此正确的使用不同的容器很关键,直接影响到数据的正确性.下面主要记录下三种重要的队列,以及一种非常 ...

  9. java并发框架支持锁包括,tip/面试题_并发与多线程.md at master · 171437912/tip · GitHub...

    01. java用()机制实现了进程之间的同步执行 A. 监视器 B. 虚拟机 C. 多个CPU D. 异步调用 正解: A 解析: 监视器机制即锁机制 02. 线程安全的map在JDK 1.5及其更 ...

  10. java并发框架支持锁包括,jdk1.8锁

    JDK1.8有什么锁?_李广进的博客-CSDN博客 2020年4月23日 18.排他锁(不包含),X锁,若事务T对数据对象A加上x锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直 ...

最新文章

  1. WebBrowserProgramming - Python Wiki
  2. MVC开发Markdown编辑器(1)
  3. JDK 14的新特性:更加好用的NullPointerExceptions
  4. 通过SPANN方式将Spring&Quartz与自定义注释集成
  5. linux运维 对比 网络_linux - 终端下查看网络实时吞吐量
  6. 前馈神经网络开山鼻祖---一些概念
  7. 在c语言中怎么实现循环结构,浅议C语言中循环结构的教学方法.pdf
  8. C4D中常用材质的创建与赋予
  9. Python多行注释/取消注释快捷键
  10. 微信支付商户号申请详细流程介绍
  11. uclinux和linux的使用区别,基于uClinux和Linux的对比分析
  12. 基于Q-Learning 的FlappyBird AI
  13. UE4 利用Mixamo自动绑骨并导入虚幻4
  14. 输入法框无法正常显示问题
  15. win10系统AMD显卡OBS录屏黑屏解决方法
  16. 保姆式Cocos合成大西瓜案例
  17. 青龙面板 Bot配置教程
  18. 红米手机html文件,手机教程知识:红米手机显示隐藏文件的操作流程
  19. 小基础设施团队的分工思路
  20. 【Fluent】iso-clip、iso-surface和plane-surface的区别,iso-surface如何添加和应用?Error:Surface creation failed错误

热门文章

  1. java bigdecimal 取整数_java-检查BigDecimal是否为整数值
  2. PS把图片切成九宫格
  3. Method annotated with @Bean is called directly. Use dependency injection instead
  4. 一款Java开源的Springboot 即时通讯 IM 聊天系统,附源码下载地址!
  5. JDK1.8和JDK1.7的HashMap源码分析以及线程不安全问题
  6. 基于JSP的共享单车管理系统的设计与实现
  7. m-TRP transmission for URLLC(draft)
  8. 苹果app没删但是桌面找不到
  9. [安卓按键精灵]彩色图片转黑白图(二值化)
  10. [Ansible专栏]Ansible条件判断的介绍和使用