AQS.doReleaseShared
共享锁的释放和独占锁的释放有一定的差别
前面唤醒锁的逻辑和独占锁是一样,先判断头结点是不是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相关推荐
- JUC并发工具的使用和原理
Condition Condition原理 Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒. 在AQS中存在两个 ...
- Java并发同步器AQS
AQS是AbstractQueuedSynchronizer的简写,中文名应该叫抽象队列同步器(我给的名字,哈哈),出生于Java 1.5. 一.什么是同步器 多线程并发的执行,之间通过某种 共享 状 ...
- 扔掉源码,15张图带你彻底理解java AQS
java中AQS是AbstractQueuedSynchronizer类,AQS依赖FIFO队列来提供一个框架,这个框架用于实现锁以及锁相关的同步器,比如信号量.事件等. 在AQS中,主要有两部分功能 ...
- 源码级深挖AQS队列同步器
我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...
- AQS分析(AbstractQueuedSynchronizer)(三)
1.AQS是什么 AQS同步器是Java并发编程的基础,从资源共享的角度分成独占和共享两种模式,像ReentrantLock.ThreadPoolExecutor.CountDownLatch等都是基 ...
- 精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用
前言 上一篇万字长文 Java AQS队列同步器以及ReentrantLock的应用 为我们读 JUC 源码以及其设计思想做了足够多的铺垫,接下来的内容我将重点说明差异化,如果有些童鞋不是能很好的理解 ...
- 死磕Java并发:J.U.C之AQS同步状态的获取与释放
本文转载自公号:Java技术驿站 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础.AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法 ...
- Java Review - 并发编程_抽象同步队列AQS
文章目录 概述 AQS--锁的底层支持 state 的作用 ConditionObject 独占 VS 共享 独占方式下,获取与释放资源的流程 共享方式下,获取与释放资源的流程 Interruptib ...
- 多线程:AQS的一些心得
AQS作为JUC并发组件实现的核心.全称是AbstructQueuedSynchronizer,也就是同步队列器. 其内部实现主要的是一个state状态标识和基于FIFO一个同步队列. 这个状态标识表 ...
最新文章
- 【OpenGL】关于OpenGL中Bind函数的理解
- eclipse: Program g++ not found in PATH
- 在 Linux“.NET研究” 操作系统中运行 ASP.NET 4 (下)
- 开源 免费 java CMS - FreeCMS-标签 channelList .
- nginx启动只有master没有worker_深入浅出Nginx
- AnalogClock的使用(二):配合数字时针
- 汇编 Irvine32链接库中一些过程函数的使用说明
- 共建智慧海关 第四范式打造快、准、稳海关单证识别系统
- python 爬虫 音乐下载 歌手_python爬虫批量下载全民K歌音乐
- 表单组件中state依赖props
- es 模糊查询_ES系列11:Term-level queries 之 3种模糊查询和terms_set query
- 异常:Invalid or unexpected token
- 业务规则方法的基本原则
- Kinect v2 使用ork功能包进行物体识别
- 第一篇 Object-C快速入门
- python flag用法_python flag什么意思
- 如何爬取ajax网页之爬取雪球网文章
- 易简无人机巡检照片处理系统(一) —— 巡检作业流程
- ps scavenge java_JVM源码分析(四)Parralel Scavenge 收集器工作流程
- IE10、IE11中WebSocket报错:SecurityError