AQS的细节--自用,非正常教程
AQS的概念
AQS叫抽象队列同步器,是一个框架,我们可以在JUC很多包看见AQS的具体实现,比如锁和读写锁,condition等,具有可扩展性,可以根据此自定义同步工具类,优点是系统开销低,实现锁比较灵活,可扩展性强,满足特殊需求。
AQS的核心思想
AQS核心思想是,如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。
这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中。AQS使用一个Volatile修饰的int类型的成员变量(State)来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作,通过CAS完成对State值的修改。
AQS的数据结构
维护一个volatile修饰的int变量state,表示同步状态;
有一个节点类,一个节点用来表示一个线程,节点里面有双向指针,也有一个volatile修饰的int表示线程状态(waitStatus);
还有一个同步队列,说是队列,实际上是一个双向链表,逻辑上是队列,只能有一个;
最后有一个条件队列,它是一个单向链表,可以有多个。
Node节点数据结构:
·····················································································································
AQS同步状态
AQS中维护了一个名为state的字段,意为同步状态,是由Volatile修饰的,用于展示当前临界资源的获锁情况。
对于我们自定义的同步工具,需要自定义获取同步状态和释放状态的方式,也就是自定义获取state的值,和改变state值的方法。
AQS对各种锁的实现
重入锁实现原理
例如ReentrantLock中,state = 0,表示还没有线程获取锁,state = 1,说明正在被使用,state > 1,表示被重入了,说明ReentrantLock自定义了state等于xxx的时候,各自代表了什么意思。
公平锁与非公平锁原理
记住一点,获取锁成功与否的标志是此线程是否成功用CAS改变了state,使其改成锁被获取的状态(比如重入锁中state=1为成功获取锁,那么如果有一个线程将state改成1,代表此线程成功获取锁),成功了就算获取锁。等到state变成0,这个时候谁会去获取锁便成了个问题,如果我们这样设计:获取锁之前先判断锁是否被获取,如果被获取,此线程将乖乖排到队尾,这样就能实现公平锁,因为避免了插队的发生嘛;如果这样设计:不作判断直接CAS尝试获取锁,竞争成功就插队,这样能实现非公平锁,因为节点无视排序直接僭越想抢锁,此为非公平嘛。
独占模式实现原理
独占和共享模式是通过修改State字段表示的同步状态来实现的(比如state只能等于0,1,那就肯定是独占锁;如果state最大等于n,那么最多允许n个线程共享数据)
独占模式顾名思义,只能一个线程使用锁,加锁过程是:如果加锁失败就进入队列,加入队列的时候,为了避免前面的线程是被中断的,或者是发生异常的,那如果不处理这种线程,那这辈子此节点也获取不了锁,于是它利用pre指针访问前驱节点判断前驱节点的状态,不对的就删除,直到到达一个正常节点的背后;锁释放后,为了找到正常节点,也会将后继异常节点清除直到找到合适的来唤醒
共享模式实现原理
顾名思义,锁是可共享的,于是如果一个节点获取了锁,那么它将唤醒后续其他想获取锁的,节点状态是共享的所有节点,直到碰到非共享状态节点,解锁也会唤醒后续线程。
其他应用场景
AQS的细节--自用,非正常教程相关推荐
- 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程
通过学习可用于相机放置.建模.修整等的策略,生成令人印象深刻且逼真的建筑三维渲染.了解如何将您的3D渲染场景提升到一个新的水平,以使您的图像引人入胜.有趣且讨人喜欢.在本课程中,讲师Verena Ta ...
- 福利,PyTorch中文版官方教程来啦(附下载)
PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...
- PyTorch中文版官方教程来啦(附下载)
PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...
- PyTorch中文版官方教程来啦(附pdf下载)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架 ...
- Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间
概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...
- double类型最大值_Java后端精选基础教程:Java 中的基本数据类型「连载 6」
数据类型定义了变量可以采用的值,例如,定义变量为 int 类型,则只能取整数值. 在 Java 中有两类数据类型: 1)原始数据类型 2)非原始数据类型 - 数组和字符串是非原始数据类型,将在以后的教 ...
- pytorch 加载模型_福利,PyTorch中文版官方教程来啦(附下载)
PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...
- TensorFlow 教程 --进阶指南--3.1总览
综述 Overview Variables: 创建,初始化,保存,和恢复 TensorFlow Variables 是内存中的容纳 tensor 的缓存.这一小节介绍了用它们在模型训练时(during ...
- 【LaTeX 教程】01. LaTeX 简介与安装
[LaTeX 教程] 声明 由于最近在投稿,导师要求LaTeX版本的文章,结合最近学习,特将学习到的内容整理下来,从安装到应用,由于也是刚学习,我也是尽可能将文章中用到的LaTeX细节的地方强调出来, ...
最新文章
- 无锡易保Java面试笔试_易保面试题 - willim - BlogJava
- Android之解决ScrollView包裹了两个RecyclerView导致滑动冲突问题
- 论文阅读:Spatial Transformer Networks
- 万物皆可爬系列查看翻页翻到最后是什么
- 通过一个月时间字段分组
- 测试文档模板_基于模型的测试(贰)
- python3.5中文手册chm_python2.7中文手册.chm
- 数字通信原理与TCP/IP
- 网页制作之各种框架简介
- 国内ERP系统和SAP系统架构存在哪些差异?
- kubernetes架构及核心概念
- 用Andriod studio学习制作APP
- ChucK初步(11)
- java计算机毕业设计钢材出入库管理系统(附源码、数据库)
- “50欧姆”特性阻抗的由来
- h5调用指纹识别_基于HTML Canvas实现“指纹识别”技术,canvas指纹
- 麒麟V10服务器SP2版本离线安装MYSQL8.0
- c++2048小游戏编写
- python编写程序、从键盘输入一个年份_通过计算当年 - 出生年份使用python创建年龄计算器...
- HTML5新特性_笔记
热门文章
- cf1208E. Let Them Slide
- [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)
- P3702-[SDOI2017]序列计数【矩阵乘法】
- P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】
- P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
- 【图论】清理牛棚/Cleaning Shifts S(luogu 4644)
- 学习分享会(2019.5.31)
- [CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)
- SpringBoot2.1.9 多Redis Lettuce配置
- 正则表达式真的很骚,可惜你不会写