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的细节--自用,非正常教程相关推荐

  1. 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程

    通过学习可用于相机放置.建模.修整等的策略,生成令人印象深刻且逼真的建筑三维渲染.了解如何将您的3D渲染场景提升到一个新的水平,以使您的图像引人入胜.有趣且讨人喜欢.在本课程中,讲师Verena Ta ...

  2. 福利,PyTorch中文版官方教程来啦(附下载)

    PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...

  3. PyTorch中文版官方教程来啦(附下载)

    PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...

  4. PyTorch中文版官方教程来啦(附pdf下载)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架 ...

  5. Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间

    概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...

  6. double类型最大值_Java后端精选基础教程:Java 中的基本数据类型「连载 6」

    数据类型定义了变量可以采用的值,例如,定义变量为 int 类型,则只能取整数值. 在 Java 中有两类数据类型: 1)原始数据类型 2)非原始数据类型 - 数组和字符串是非原始数据类型,将在以后的教 ...

  7. pytorch 加载模型_福利,PyTorch中文版官方教程来啦(附下载)

    PyTorch 中文版官方教程来了. PyTorch 是近期最为火爆的深度学习框架之一,然而其中文版官方教程久久不来.近日,一款完整的 PyTorch 中文版官方教程出炉,读者朋友从中可以更好的学习了 ...

  8. TensorFlow 教程 --进阶指南--3.1总览

    综述 Overview Variables: 创建,初始化,保存,和恢复 TensorFlow Variables 是内存中的容纳 tensor 的缓存.这一小节介绍了用它们在模型训练时(during ...

  9. 【LaTeX 教程】01. LaTeX 简介与安装

    [LaTeX 教程] 声明 由于最近在投稿,导师要求LaTeX版本的文章,结合最近学习,特将学习到的内容整理下来,从安装到应用,由于也是刚学习,我也是尽可能将文章中用到的LaTeX细节的地方强调出来, ...

最新文章

  1. 无锡易保Java面试笔试_易保面试题 - willim - BlogJava
  2. Android之解决ScrollView包裹了两个RecyclerView导致滑动冲突问题
  3. 论文阅读:Spatial Transformer Networks
  4. 万物皆可爬系列查看翻页翻到最后是什么
  5. 通过一个月时间字段分组
  6. 测试文档模板_基于模型的测试(贰)
  7. python3.5中文手册chm_python2.7中文手册.chm
  8. 数字通信原理与TCP/IP
  9. 网页制作之各种框架简介
  10. 国内ERP系统和SAP系统架构存在哪些差异?
  11. kubernetes架构及核心概念
  12. 用Andriod studio学习制作APP
  13. ChucK初步(11)
  14. java计算机毕业设计钢材出入库管理系统(附源码、数据库)
  15. “50欧姆”特性阻抗的由来
  16. h5调用指纹识别_基于HTML Canvas实现“指纹识别”技术,canvas指纹
  17. 麒麟V10服务器SP2版本离线安装MYSQL8.0
  18. c++2048小游戏编写
  19. python编写程序、从键盘输入一个年份_通过计算当年 - 出生年份使用python创建年龄计算器...
  20. HTML5新特性_笔记

热门文章

  1. cf1208E. Let Them Slide
  2. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)
  3. P3702-[SDOI2017]序列计数【矩阵乘法】
  4. P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】
  5. P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
  6. 【图论】清理牛棚/Cleaning Shifts S(luogu 4644)
  7. 学习分享会(2019.5.31)
  8. [CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)
  9. SpringBoot2.1.9 多Redis Lettuce配置
  10. 正则表达式真的很骚,可惜你不会写