共享锁的释放和独占锁的释放有一定的差别

前面唤醒锁的逻辑和独占锁是一样,先判断头结点是不是SIGNAL状态,如果是,则修改为0,并且唤醒头结点的下一个节点

PROPAGATE: 标识为PROPAGATE状态的节点,是共享锁模式下的节点状态,处于这个状态下的节点,会对线程的唤醒进行传播

private void doReleaseShared() { for (;;) { Node h = head; if (h != null && h != tail) { int ws = h.waitStatus; if (ws == Node.SIGNAL) { if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) continue; // loop to recheck cases unparkSuccessor(h); } // 这个 CAS 失败的场景是:执行到这里的时候,刚好有一个节点入队,入队会将这个 ws 设置为 -1 else if (ws == 0 && !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) continue; // loop on failed CAS } // 如果到这里的时候,前面唤醒的线程已经占领了 head,那么再循环// 通过检查头节点是否改变了,如果改变了就继续循环 if (h == head) // loop if head changed break; }
} 

h == head:说明头节点还没有被刚刚用 unparkSuccessor 唤醒的线程(这里可以理解为 ThreadB)占有,此时 break 退出循环。

h != head:头节点被刚刚唤醒的线程(这里可以理解为 ThreadB)占有,那么这里重新进入下一轮循环,唤醒下一个节点(这里是 ThreadB )。我们知道,等到 ThreadB 被唤醒后,其实是会主动唤醒 ThreadC...

AQS.doReleaseShared相关推荐

  1. JUC并发工具的使用和原理

    Condition Condition原理 Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒. 在AQS中存在两个 ...

  2. Java并发同步器AQS

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

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

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

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

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

  5. AQS分析(AbstractQueuedSynchronizer)(三)

    1.AQS是什么 AQS同步器是Java并发编程的基础,从资源共享的角度分成独占和共享两种模式,像ReentrantLock.ThreadPoolExecutor.CountDownLatch等都是基 ...

  6. 精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用

    前言 上一篇万字长文 Java AQS队列同步器以及ReentrantLock的应用 为我们读 JUC 源码以及其设计思想做了足够多的铺垫,接下来的内容我将重点说明差异化,如果有些童鞋不是能很好的理解 ...

  7. 死磕Java并发:J.U.C之AQS同步状态的获取与释放

    本文转载自公号:Java技术驿站 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础.AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法 ...

  8. Java Review - 并发编程_抽象同步队列AQS

    文章目录 概述 AQS--锁的底层支持 state 的作用 ConditionObject 独占 VS 共享 独占方式下,获取与释放资源的流程 共享方式下,获取与释放资源的流程 Interruptib ...

  9. 多线程:AQS的一些心得

    AQS作为JUC并发组件实现的核心.全称是AbstructQueuedSynchronizer,也就是同步队列器. 其内部实现主要的是一个state状态标识和基于FIFO一个同步队列. 这个状态标识表 ...

最新文章

  1. 【OpenGL】关于OpenGL中Bind函数的理解
  2. eclipse: Program g++ not found in PATH
  3. 在 Linux“.NET研究” 操作系统中运行 ASP.NET 4 (下)
  4. 开源 免费 java CMS - FreeCMS-标签 channelList .
  5. nginx启动只有master没有worker_深入浅出Nginx
  6. AnalogClock的使用(二):配合数字时针
  7. 汇编 Irvine32链接库中一些过程函数的使用说明
  8. 共建智慧海关 第四范式打造快、准、稳海关单证识别系统
  9. python 爬虫 音乐下载 歌手_python爬虫批量下载全民K歌音乐
  10. 表单组件中state依赖props
  11. es 模糊查询_ES系列11:Term-level queries 之 3种模糊查询和terms_set query
  12. 异常:Invalid or unexpected token
  13. 业务规则方法的基本原则
  14. Kinect v2 使用ork功能包进行物体识别
  15. 第一篇 Object-C快速入门
  16. python flag用法_python flag什么意思
  17. 如何爬取ajax网页之爬取雪球网文章
  18. 易简无人机巡检照片处理系统(一) —— 巡检作业流程
  19. ps scavenge java_JVM源码分析(四)Parralel Scavenge 收集器工作流程
  20. IE10、IE11中WebSocket报错:SecurityError

热门文章

  1. System.IO 的三个抽象类
  2. vue中前端处理token过期的方法与axios请求拦截处理
  3. JavaSE基础知识(5)—面向对象(5.3访问修饰符)
  4. HDU 3938 Portal
  5. 模板载入与模板继承的区别
  6. bfc和haslayout
  7. zigbee 协议栈数据类型及转换
  8. 基于Axis服务端的webservice客户端实现
  9. Facebook推出Pythia 开源 可用于图像及语言分析
  10. 计算机语言发展及未来方向