作用

  参与 共享锁 acquireShared() 和 独占锁 acquire() 的抢锁逻辑,
具体的抢锁逻辑不作实现,只对第一次抢锁未抢到锁线程做处理,第一次抢锁就抢到的线程就不需要遇到AQS了

方法、属性:

       AQS属性:

                head 头结点   已经入队的节点只有前置节点是头节点的情况下才有机会抢锁

                tail  尾结点  入队就从这里入

       Node属性:

                pre 前置节点,
next 后置节点
waitStatus 状态 0代表已经入队的第一个线程持有锁
1代表下一个线程取消了排队
-1代表可以下一个线程可以抢锁了
-2代表下一个线程正在中断,等待唤醒
-3代表抢的是共享锁,后面的线程抢共享锁的线程都可以得到锁
exclusive 是否独占模式 AQS方法:
acquire():未入队的线程抢锁使用这个方法
   请求锁,如果未请求成功且以独占模式入队成功则当前线程先中断 acquireQueued():已经入队的线程抢锁使用这个方法 addWaiter(): 描述: 先尝试用CAS进行快速入队,失败则调用enq()方法入队
enq(): 描述 for循环+CAS 入队

独占锁的获取和释放

方法名 描述
acquire() 请求获取锁,如果未获取成功 &&以独占模式入队成功且前置节点不是头节点 则中断当前线程
tryAcquire(arg) 尝试请求锁,该方法在AQS中不做实现
acquireQueued(Node,arg) 已经入队的线程使用for循环+CAS操作尝试调用tryAcquire()请求锁:当入队后发现前置节点是头节点则尝试请求锁,如果请求成功则出队,如果失败则使用shouldParkAfterFailedAcquire(pred,node)判断是否需要中断当前线程,如果不需要则在循环中继续尝试获取锁
shouldParkAfterFailedAcquire(pred,node) 如果前置节点的waitStatus是SIGNAL则表示当前线程需要中断,或者前置节点被取消了(取消状态是1)就向前查找还在排队的节点,这个时候当前线程还有机会再尝试获取锁
addWaiter(mode) 先尝试使用CAS进行快速入队,失败则调用enq()进行入队
enq(node) 使用for循环加CAS操作进行入队
release(arg) 释放锁:调用tryRelease尝试释放锁,如果释放成功了则判断有没有线程在排队,如果有则使用LockSupport.unpark(Thread)唤醒队列中第一个线程
tryRelease(arg) 尝试释放锁,该方法在AQS中不作实现

总结:
对于线程来说最重要的是 获取锁,中断,唤醒,释放锁

   获取锁:线程入队前会尝试请求一次锁
入队后会检查当前线程的前置节点是不是head节点,如果是且waitStatus是SIGNAL,则尝试获取锁, 中断:线程在未抢到锁的时候中断(废话)
唤醒:(只有未抢到锁的线程且已经入队的线程)线程在队列中的第一个,且持有锁的线程释放了锁
释放锁:已经抢到锁的线程调用release()方法就释放了
节点入队:第一次抢锁未抢到锁就会入队
节点出队:第一次没抢到锁,后来 抢到锁了或者取消抢锁了就会出队

AQS学习笔记之独占锁的更多相关文章

  1. 并发编程学习笔记(6)----公平锁和ReentrantReadWriteLock使用及原理

    (一)公平锁 1.什么是公平锁? 公平锁指的是在某个线程释放锁之后,等待的线程获取锁的策略是以请求获取锁的时间为标准的,即使先请求获取锁的线程先拿到锁. 2.在java中的实现? 在java的并发包中 ...

  2. AQS详解之独占锁模式

    AQS介绍 AbstractQueuedSynchronizer简称AQS,即队列同步器.它是JUC包下面的核心组件,它的主要使用方式是继承,子类通过继承AQS,并实现它的抽象方法来管理同步状态,它分 ...

  3. Redis学习笔记~Redis并发锁机制

    回到目录 redis客户端驱动有很多,如ServiceStack.Redis,StackExchange.Redis等等,下面我使用ServiceStack.Redis为例,介绍一下在redis驱动中 ...

  4. Java 学习笔记之 Synchronized锁重入

    Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...

  5. Java 学习笔记之 Synchronized锁对象

    Synchronized锁对象: Synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其 ...

  6. Mysql学习笔记-临键锁实验

    前言 昨天同事跟我聊到一个问题:InnoDB里面间隙锁锁住的数据可以update么?我们经常都说间隙锁是InnoDB在RR隔离级别下防止幻读的一种处理手段.它可以防止数据在间隙范围中insert数据, ...

  7. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  8. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  9. 并发编程学习笔记(5)----AbstractQueuedSynchronizer(AQS)原理及使用

    (一)什么是AQS? 阅读java文档可以知道,AbstractQueuedSynchronizer是实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架, ...

随机推荐

  1. 解决consul覆盖注册

    默认注册consul的服务id为服务名-端口号,相同的服务名和端口号注册会覆盖 解决方式: 1.自定义Consul注册Id import com.ecwid.consul.v1.ConsulClien ...

  2. Navicat 进行数据库自动备份

    今天经历一次数据库丢库事件,顿时觉得定时备份数据库很重要. 但是每天自己手动备份实在是太麻烦了,于是乎,想到用计划任务进行每天定时自动备份. 发现Navicat自带就有备份  还可以直接计划任务,贼方 ...

  3. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

  4. 基于jQuery实现简单的js模块化

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...

  5. jeecg字典表—报表配置(popup弹框)

    新建字典表 录入字典数据 新建报表配置 新建用于popup的表 字典Code中对应,用户接受popup返回的字段(按顺序写) 结果校验

  6. flex.css

    flex.css:https://codepen.io/webstermobile/pen/apXEER/

  7. 菜鸟学IT之简易四则运算程序开发

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166 作业要求: 任何编程语言都可以,命令行程序接受一个数字输入,然后 ...

  8. mybatis 一对多查询

    需求:一条数据对应多张表 ad_share_friends  主表 ad_share_image 图片表 建立实体 adShareFriends  和  adShareImage *注意在adShar ...

  9. java返回数据工具类

    import com.qbskj.project.util.SpringUtils; /** * 消息 * */ public class Message { /** * 类型 */ public e ...

  10. 【转】Linux中的特殊权限粘滞位(sticky bit)详解

    Linux下的文件权限 在linux下每一个文件和目录都有自己的访问权限,访问权限确定了用户能否访问文件或者目录和怎样进行访问.最为我们熟知的一个文件或目录可能拥有三种权限,分别是读.写.和执行操作, ...