视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

AQS源码深度剖析

  • 课程笔记
  • 问答交流

在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS。

本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计有清晰了解,让你迈出高并发编程的第一步。

为了助大家掌握好AQS,本节课我会重点讲解以下8点:

1.AQS的核心概念

2.AQS资源共享方式

3.AQS核心成员

4.AQS数据模型

5.AQS实现原理

6.AQS锁核心源码剖析

7.AQS锁的获取原理与流程图

8.AQS的总结

AQS

评论交流
  1. JansenZhang

    图片上传不知道怎么用

    • mikechen

      图片可以结合文字正常提交,我这边刚看到了,没有问题。

    • JansenZhang

      嗯,这个图片上传了以后在文本框里没有回显,所以不能及时知道有没有上传成功。现在知道怎么使用了。

  2. JansenZhang

    AbstractQueuedSynchronizer,抽象队列同步器,是jdk为同步器提供的一个框架。
    在AQS中,主要有三个变量,head,tail,state,这三个变量均使用volatile关键字进行修饰,保证了多线程情况下的可见性。
    AQS的使用state来标记同步状态,在使用过程中设置state是通过CAS操作来实现,从而保证了原子性。AQS使用CLH(FIFO)队列来存储线程的等待节点,当线程获取同步状态失败时,会将当前线程和等待状态等信息构造成一个节点加入到同步队列的队尾,同时会阻塞当前线程。
    ReentrantLock、Semaphore、CountDownLatch等都是通过AQS方式实现。

  3. 路正银

    AQS的底层实现:
    一个全局的volitile int state来表示同步状态,用volatile来保证可见性,用CAS来保证原子性
    CLH同步队列来完成线程等待排队
    基于AQS的同步组件有:
    ReentrantLock(独占锁)
    Semaphore、CountDownLatch、CyclicBarrier(共享锁)

  4. 李鸿翼

    AQS是抽象队列同步器,是java并发的底层基石。
    AQS的核心模型包含2个: 一个volatile的state变量,一个fifo的队列。state状态的改变是通过cas操作来执行,保障了操作的原子性,而volatile修饰符保障了多线程间的state状态的可见性。
    reentrantlock是基于AQS的独占锁实现,countdownlatch、cyclebarrier等是基于aqs的共享锁实现。
    获取锁的流程图如下:
    (ps:老师,自旋那里,我看了代码,自旋第二次,就阻塞了,不是一直自旋)

    • mikechen

      是的,你这个更加准确,自旋这里会发生两次,两次后会进入阻塞状态:

      第一次:前驱的状态为0,执行compareAndSetWaitStatus后返回false。

      第二次:才能进入if (ws == Node.SIGNAL)这个分支,才能返回true。

      如果当前线程一直不能获取到锁,死循环保证了最终一定能设置前驱为SIGNAL成功。

      这里关于SIGNAL与阻塞的理解,可以用闹钟与睡觉这个比喻更容易来理解:

      比如:前驱节点已经设置了SIGNAL,表示闹钟已经设好,可以安心睡觉(阻塞)。