参照:http://ifeve.com/introduce-abstractqueuedsynchronizer/

前言:

在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),内部实现都依赖AbstractQueuedSynchronizer类

public abstract class AbstractQueuedSynchronizer extendsAbstractOwnableSynchronizer implements java.io.Serializable { //等待队列的头节点private transient volatile Node head;//等待队列的尾节点private transient volatile Node tail;//同步状态private volatile int state;protected final int getState() { return state;}protected final void setState(int newState) { state = newState;}...
}

队列同步器AQS通过内置的FIFO队列来完成资源获取线程的排队工作。

volatile修饰,保证多线程之间的可见。

FIFO队列 先进先出

Head 节点本身不保存等待线程的信息,它通过 next 变量指向第一个保存线程等待信息的节点(Node1)。当线程被唤醒之后,会删除 Head 节点,而唤醒线程所在的节点会设置为 Head 节点(Node1 被唤醒之后,Node1会被置为 Head 节点)。

static final class Node {static final Node SHARED = new Node();static final Node EXCLUSIVE = null;//独占模式static final int CANCELLED =  1;//等待超时或中断,此节点不会竞争锁,也不会被阻塞。此节点会被移出队列,被GC回收。static final int SIGNAL    = -1;//表示当前节点的后继节点包含的线程需要运行,也就是unpark;static final int CONDITION = -2;//表示当前节点在等待condition,也就是在condition队列中;static final int PROPAGATE = -3;//在共享模式下,可以认为资源有多个,因此当前线程被唤醒之后,可能还有剩余的资源可以唤醒其他线程。该状态用来表明后续节点会传播唤醒的操作。需要注意的是只有头节点才可以设置为该状态volatile int waitStatus;//代表对应线程状态 0 表示当前节点在sync队列中,等待着获取锁。volatile Node prev;volatile Node next;volatile Thread thread;//入队列时的当前线程。Node nextWaiter;//指向下一个在某个条件上等待的节点,或者指向 SHARE 节点,表明当前处于共享模式...}

等待队列时FIFIO先进先出,只有前面一个节点的状态为SIGNAL时,当前节点才会被挂起。

参考:https://www.cnblogs.com/zhangjk1993/archive/2017/04/15/6715653.html

独占锁获取流程:

独占锁释放:

共享锁释放流程:

共享锁获取流程:

转载于:https://www.cnblogs.com/L-a-u-r-a/p/8563983.html

java同步器__学习笔记相关推荐

  1. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  2. java.util.List学习笔记

    概述 在Java中,List是一种特殊的集合结构,即:List是一种有序的集合.在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等: List一般允许重复 ...

  3. Java快速入门学习笔记9 | Java语言中的方法

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  4. Java快速入门学习笔记8 | Java语言中的数组

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  5. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  6. Java快速入门学习笔记6 | Java语言中的for循环语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  7. Java快速入门学习笔记5 | Java语言中的while循环语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  8. Java快速入门学习笔记4 | Java语言中的if条件语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  9. Java快速入门学习笔记3 | Java语言中的表达式与操作符

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. noi题库(noi.openjudge.cn) 3.9数据结构之C++STL T1——T2
  2. 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生
  3. java如何对一个表达式开根号_作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?...
  4. SAP云平台架构概述
  5. 计算机网络安全管理协议,河西学院校园网络安全管理协议
  6. PetShop之ASP.NET缓存(转载)
  7. Python自动单元测试框架
  8. 怎么输入license_误执行了 rm fr /* 之后,除了跑路还能怎么办?!
  9. Web前端工作笔记010---IE8兼容_IE8不能使用foreach_indexOf的解决方案
  10. phoshop cs6软件提示试用版已过期,怎么办
  11. 解释一下为什么数据文件最好采用单字符作为字段分隔符
  12. TypeError: this.getResolve is not a function
  13. COOKIE和SESSION之间的区别以及用法
  14. DL for Scratch 读书笔记
  15. catia怎么创建约束快捷键_CATIA怎么设置快捷键?
  16. syswow64删除文件_什么是SysWow64文件夹 SysWow64文件夹可以删除吗
  17. HHKB键盘使用说明书
  18. java-unrar-0.3.jar_java-unrar-0.3.jar解压
  19. 前端页面嵌入word文档_word文档怎样加页面
  20. 区块链市场——专为用户打造的一站式应用下载平台

热门文章

  1. while语句,do-while与for循环的介绍
  2. left join,right join,inner join,full join之间的区别
  3. MySQL存储过程之查询受影响的行数与查询到的行数
  4. Kotlin入门(31)JSON字符串的解析
  5. 文本居于图片左侧html,CSS实现图片与文本的居中对齐的常见方式
  6. shell 批量生成随机文件
  7. python基于SMTP发送邮件(qq邮箱)
  8. Spring MVC请求处理流程分析
  9. angular4 辅助路由
  10. 博为峰JavaEE技术文章 ——MyBatis Provider之@SelectProvider SQL方法