`
longzhun
  • 浏览: 370228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AQS架构

 
阅读更多

1. LockSupport类
AQS架构使用LockSupport来实现线程的休眠,时间性休眠,唤醒...

2. ‍AQS架构-所有同步器的基本架构
----- a. 基于‍‍AQS架构的同步器基本上只需要实现四个函数
          1. tryAcqurie(int) -- 线程会调用这个函数来做能否互斥的获取同步器资源的尝试的逻辑
          2. tryRelease(int) -- ‍线程会调用这个函数来做能否互斥的释放同步器资源的尝试的逻辑
          3. tryAcqurieShared(int) -- ‍线程会调用这个函数来做能否共享的获取同步器资源的尝试的逻辑
          ‍4. tryReleaseShared(int) -- ‍ ‍线程会调用这个函数来做能否共享的释放同步器资源的尝试的逻辑

----- b. 基于AQS架构同步器分为
          互斥同步器 例如‍ReentrantLock
          共享同步器 例如‍Semaphore
          互斥和共享共存的同步器‍ReentrantReadWriteLock
          接下来会有文章依次介绍这些同步器的实现

----- c. AQS数据结构
         1. 对于首次进入时获取资源失败的Thread,会将其封装到一个NODE数据块里面
         2. 会维护两个NODE引用,分别指向NODE双向链表的头和尾,这样来实现FIFO
         3. 对于同步器所拥有的资源就是使用一个INT来表示,这也就是‍互斥和共享共存的
         同步器‍同时共享的线程只能是2个BYTE能表示的长度的原因,所有又推出了一个LONG型的AQS架构

----- d. AQS核心代码
          1. acquireQueued() 实现了线程不可中断模式下的互斥获取资源
          其主要逻辑是一个死循环
              a. 线程所属的NODE->prev是HEAD才会调用‍tryAcqurie执行尝试获取锁的逻辑
              b. 如果尝试获取锁成功则head=NODE,以及一个释放HARD REFERENCE的操作
              c. 返回线程在WAIT期间是否被标记中断 ---> 线程摆脱同步器的控制
              d. 对‍‍tryAcqurie尝试失败后是否需要WAIT做出判断 ---- 重点处
                  1. 如果前一个NODE处于WAIT则它一定要WAIT
                  2. 如果前一个NODE处于CANCEL则做一个链表的删除工作
                  3. 如果前一个NODE是最后加入的则将其标记为WAIT
                  4. 2和3会让线程再做一次尝试,不会阻塞线程
              e. 如果线程需要阻塞则调用‍LockSupport.park阻塞,两种方式会让线程醒来
                  1. 线程被标记中断
                  2. 别的线程‍用‍LockSupport.unpark了它,有线程释放了互斥资源
              f. 线程醒来循环到a
              g. 程序的逻辑就是一个尝试获取资源,线程阻塞,被唤醒的轮回

          2. ‍doAcquireInterruptibly()‍实现了线程可中断模式下的互斥获取资源
          其原理和‍acquireQueued()一样,不同之处是线程在被中断后即在1.e.1条件下会直接退出死循环

          3. ‍doAcquireNanos‍()‍实现了线程可中断+记时模式下的互斥获取资源             
               a. 在阻塞前会先计算阻塞的时间,进入休眠
               b. 如果被中断则会判断时间是否到了
                  1. 如果没到则且被其他线程设置了中断标志,退出那个轮回,抛出中断异常,如果没有被设置中断标记则是前一个线程
                  释放了资源再唤醒了它,其继续走那个轮回,轮回中,如果tryAcquire成功则摆脱了同步器的控制,否则回到a
                  2. 如果时间到了则退出轮回,获取资源失败

          4. release()实现了互斥资源的释放,最主要的工作就是将其下一个线程唤醒‍1.e.2

          5. doAcquireShared()‍实现了线程不可中断模式下的共享获取资源
               a. 线程所属的NODE->prev是HEAD才会调用‍‍tryAcquireShared执行尝试获取锁的逻辑
               b. 如果尝试获取锁成功则head=NODE,以及一个释放HARD REFERENCE的操作
               此处和互斥的明显区别是,线程在获取成功后如果还有剩余的资源会唤醒其后的线程
               也就是如果其下一个线程也是共享的获取资源,其被唤醒的理由多了个
               c. 线程在WAIT期间是否被标记中断则标记,因为这期间的标记状态会被清掉 ---> 线程摆脱同步器的控制
               d. 对‍‍tryAcquireShared尝试失败后是否需要WAIT做出判断 ---- 重点处
                  1. 如果前一个NODE处于WAIT则它一定要WAIT
                  2. 如果前一个NODE处于CANCEL则做一个链表的删除工作
                  3. 如果前一个NODE是最后加入的则将其标记为WAIT
                  4. 2和3会让线程再做一次尝试,不会阻塞线程
               e. 如果线程需要阻塞则调用‍LockSupport.park阻塞,三种方式会让线程醒来
                   1. 线程被标记中断
                   2. 别的线程‍释放了资源LockSupport.unpark了它
                   3. 其前一个共享线程醒了以后获取了资源而其还有资源也会唤醒它
               f. 线程醒来循环到a
               g. 程序的逻辑就是一个尝试获取资源,线程阻塞,被唤醒的轮回

          6. ‍doAcquireSharedInterruptibly()‍实现了线程可中断模式下的共享获取资源
          其原理和‍‍doAcquireShared()一样,不同之处是线程在被中断后即在5.e.1条件下会直接退出死循环

          7. doAcquireSharedNanos()‍实现了线程可中断+记时模式下的共享获取资源
               a. 在阻塞前会先计算阻塞的时间,进入休眠
               b. 如果被中断则会判断时间是否到了
                  1. 如果没到则且被其他线程设置了中断标志,退出那个轮回,抛出中断异常,如果没有被设置中断标记则是前一个线程
                  释放了资源再唤醒了它,其继续走那个轮回,轮回中,如果tryAcquire成功则摆脱了同步器的控制,否则回到a
                  2. 如果时间到了则退出轮回,获取资源失败

           8. ‍releaseShared()和‍release()一样

分享到:
评论

相关推荐

    JDK_AQS解析

    #### 锁的类图与架构 AQS采用模板方法模式,大多数与锁相关的操作都在`AbstractQueuedSynchronizer`类中完成。它提供了一个同步器的框架,其中包含了共享资源的状态管理、线程排队机制等核心功能。开发者可以通过...

    JAVA后端架构师.pdf

    9. 异步计算基础知识:Future与FutureTask详解、CompletableFuture详解、AQS源码解析等。 10. 算法与数据结构基础知识:冒泡、选择、插入、查找算法之二分法、局部最小值、时间复杂度与常见时间复杂度列表、对数器...

    7、深入理解AQS独占锁之ReentrantLock源码分析(1).pdf

    根据给定文件的信息,我们可以深入理解AQS(AbstractQueuedSynchronizer)独占锁之ReentrantLock的源码分析及其实现原理。这不仅包括ReentrantLock本身的特性,还包括了其背后的AQS框架是如何工作的。 ### 一、管程...

    阿里专家级并发编程架构师课程-网盘链接提取码下载 .txt

    阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...

    图灵Java高级互联网架构师第6期并发编程专题笔记.zip

    内容包括 ...10-深入理解AQS之Semaphorer&CountDownLatch&CyclicBarrie详解-fox 11-深入理解AQS之CyclicBarrier&ReentrantReadWriteLock详解-fox 12-深入理解AQS之ReentrantReadWriteLock详解-fox ...

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...

    波音质量体系的特点[文].pdf

    波音的质量管理模式不仅体现在严谨的组织架构上,还深入到产品生命周期的每个环节,形成了一套独特的先进质量管理体系(AQS)。本文将详述波音质量体系的特色和运作机制。 首先,波音公司的质量组织结构严谨而高效...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    优秀博文汇总1

    本资源摘要信息涵盖了 Tomcat 源码剖析,包括 Tomcat 的架构、类加载器、请求处理机制等。 Java 并发编程 Java 并发编程是指使用 Java 语言编写多线程程序,用于提高程序的执行效率和响应速度。本资源摘要信息涵盖...

    A daptive Splitting Protocols for RFID Tag Collision Arbitration

    《适应性分割协议在RFID标签碰撞仲裁中的应用》 ...未来的研究方向可以进一步探索如何在不同的网络架构和设计环境中优化这些协议,以及如何结合人工智能、机器学习等前沿技术,使RFID系统的性能达到更高的水平。

    2018 最新java面试题(技术面试)

    Spring MVC是一个基于MVC架构的框架,其核心组件是DispatcherServlet。整个流程可以分为以下几个步骤: 1. **客户端发起请求**:用户通过浏览器等客户端工具发送HTTP请求。 2. **DispatcherServlet接收请求**:...

    java八股文多线程面试题.pdf

    自旋锁是一种低级别的同步机制,在SMP(Symmetric Multi-Processing,对称多处理)架构中较为常见。当一个线程试图获取已经被其他线程持有的自旋锁时,该线程会在一个循环中持续检查锁的状态,直到锁可用为止。需要...

    个人用了8年的Java工程师简历

    - **Java锁机制**: 掌握synchronized关键字、ReentrantLock等同步机制,理解AQS框架及其应用场景。 ### DevOps实践 - **持续集成/持续部署(CI/CD)**: 了解DevOps理念,能够使用Jenkins、GitLab CI等工具进行自动...

    【2018最新最详细】并发多线程教程

    8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10.彻底理解ReentrantLock 11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13....

Global site tag (gtag.js) - Google Analytics