zoukankan      html  css  js  c++  java
  • AQS

    一、AQS是什么?

    首先我们来普及一下juc是什么:juc其实就是包的缩写(java.util.concurrnt)

    • 不要被人家唬到了,以为juc是什么一个牛逼的东西。其实指的是包而已

    我们可以发现lock包下有三个抽象的类:

    • AbstractOwnableSynchronizer
    • AbstractQueuedLongSynchronizer
    • AbstractQueuedSynchronizer

    通常地:AbstractQueuedSynchronizer简称为AQS

    我们Lock之类的两个常见的锁都是基于它来实现的。

    看源码总结出以下比较关键的信息:

    • AQS其实就是一个可以给我们实现锁的框架
    • 内部实现的关键是:先进先出的队列、state状态
    • 定义了内部类ConditionObject
    • 拥有两种线程模式
    • – 独占模式和共享模式
    • 在LOCK包中的相关锁(常用的有ReentrantLock、 ReadWriteLock)都是基于AQS来构建
    • 一般我们叫AQS为同步器

    二、简单看看AQS

    上面也提到了AQS里边最重要的是状态和队列,我们接下来就看看其源码是怎么样的...

    2.1同步状态

    使用volatile修饰实现线程可见性:

    修改state状态值时使用CAS算法来实现:

    2.2先进先出队列

    这个队列被称为:CLH队列(三个名字组成),是一个双向队列

    2.3acquire方法

    获取独占锁的过程就是在acquire定义的,该方法用到了模板设计模式,由子类实现的

    过程:acquire(int)尝试获取资源,如果获取失败,将线程插入等待队列。插入等待队列后,acquire(int)并没有放弃获取资源,而是根据前置节点状态状态判断是否应该继续获取资源,如果前置节点是头结点,继续尝试获取资源,如果前置节点是SIGNAL状态,就中断当前线程,否则继续尝试获取资源。直到当前线程被park()或者获取到资源,acquire(int)结束。

    2.4release方法

    释放独占锁的过程就是在acquire定义的,该方法也用到了模板设计模式,由子类实现的

    过程:首先调用子类的tryRelease()方法释放锁,然后唤醒后继节点,在唤醒的过程中,需要判断后继节点是否满足情况,如果后继节点不为且不是作废状态,则唤醒这个后继节点,否则从tail节点向前寻找合适的节点,如果找到,则唤醒。

  • 相关阅读:
    分页功能
    四个内置对象的作用范围
    include和application
    jsp中的session
    IDC机房的相关常识
    使用dm-cache组合SSD与HDD实现高性价比存储
    负载均衡基本原理与lvs
    秒级别执行脚本的方法
    Tomcat调优
    Nginx调优
  • 原文地址:https://www.cnblogs.com/harpoonJava/p/13225238.html
Copyright © 2011-2022 走看看