作用

  参与 共享锁 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. iOS 快捷下载和安装并使用CocoaPods

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,手动一个个去下载所需类库十 ...

  2. Django Rest Framework(一)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 class UserInfo(models.Model): "" ...

  3. HTML基础知识个人总结

    [学习的网站是主要是W3school,还加上一些其他搜索学习到的内容,仅在博客做个人整理] 一.标签——尖括号围成的关键词,成对出现. ※使用时必须符合标签嵌套规则 1. (1) <!DOCTY ...

  4. VS编程,C#串口通讯,通过串口读取数据的一种方法

    一.可能需要的软件:1.虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯. 2.友善串口调试助手,用来发送.读取数据. 二.思路1.查询本机 ...

  5. iview 将table的selection多选变单选方法

    相信很多使用iview的朋友,在用到table,都会遇到需要使用selection的场景,但是总会有那么一个产品汪,觉得iview的单选效果不好,非要用selection的来做单选,那么下面这个方法就 ...

  6. (五)jdk8学习心得之默认方法

    五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...

  7. 总结idea几个实用的快捷键

    Ctrl+R,替换文本Ctrl+F,查找文本 Ctrl+shit+R,全局替换文本Ctrl+shit+F,全局查找文本 Ctrl+Alt+L,格式化代码Alt+Insert,可以生成构造器/Gette ...

  8. 队列(FIFO)—循环队列、队列的链式存储

    1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...

  9. java 基本数据类型初始值(默认值)

    1.int类型定义的数组,初始化默认是0 2.String类型定义的数组,默认值是null 3.char类型定义的数组,默认值是0对应的字符 4.double类型定义的数组,默认值是0.0 5.flo ...

  10. nginx--default_server定义规则及配置

    nginx 的 default_server 指令可以定义默认的 server 出处理一些没有成功匹配 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 de ...